Comment spécifiez-vous le format de date utilisé lorsque JAXB marshals xsd: dateTime?
Lorsque JAXB marshals un objet date (XMLGregorianCalendar
) dans un élément xsd: dateTime comment pouvez-Vous spécifier le format du XML résultant?
Par exemple:
Le format de données par défaut est utilise millisecondes <StartDate>2012-08-21T13:21:58.000Z</StartDate>
Je dois omettre les millisecondes. <StartDate>2012-08-21T13:21:58Z</StartDate>
Comment puis-je spécifier le format de formulaire/date de sortie que je veux utiliser?
J'utilise javax.xml.datatype.DatatypeFactory
pour créer l'objet XMLGregorianCalendar
.
XMLGregorianCalendar xmlCal = datatypeFactory.newXMLGregorianCalendar(cal);
3 réponses
Vous pouvez utiliser un XmlAdapter
pour personnaliser la façon dont un type de date est écrit en XML.
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DateAdapter extends XmlAdapter<String, Date> {
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public String marshal(Date v) throws Exception {
synchronized (dateFormat) {
return dateFormat.format(v);
}
}
@Override
public Date unmarshal(String v) throws Exception {
synchronized (dateFormat) {
return dateFormat.parse(v);
}
}
}
Ensuite, vous utilisez l'annotation @XmlJavaTypeAdapter
pour spécifier que le XmlAdapter
doit être utilisé pour un champ/une propriété spécifique.
@XmlElement(name = "timestamp", required = true)
@XmlJavaTypeAdapter(DateAdapter.class)
protected Date timestamp;
Utilisation d'un fichier de liaison xjb:
<jxb:javaType name="java.time.ZonedDateTime"
xmlType="xs:dateTime"
parseMethod="my.package.DateAdapter.parseDateTime"
printMethod="my.package.DateAdapter.formatDateTime" />
Produira l'annotation mentionnée ci-dessus.
J'utilise un SimpleDateFormat pour créer le XMLGregorianCalendar, comme dans cet exemple:
public static XMLGregorianCalendar getXmlDate(Date date) throws DatatypeConfigurationException {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(date));
}
public static XMLGregorianCalendar getXmlDateTime(Date date) throws DatatypeConfigurationException {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(date));
}
La première méthode crée une instance de XMLGregorianCalendar qui est formatée par le marshaller XML en tant que xsd:date valide, la seconde méthode aboutit à un XSD:dateTime valide.
Moyen Très facile pour moi. Formatage XMLGregorianCalendar pour le marshalling en java.
Je viens de créer mes données dans le bon format. Le toString
sera appelé produisant le bon résultat.
public static final XMLGregorianCalendar getDate(Date d) {
try {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(d));
} catch (DatatypeConfigurationException e) {
return null;
}
}