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);
75
demandé sur Xstian 2012-11-26 20:03:36

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.

112
répondu Blaise Doughan 2017-01-09 12:59:15

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.

15
répondu Andrea Luciano 2014-04-29 23:08:09

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;
    }
}
1
répondu Iván 2017-08-28 08:36:56