Comment puis-je représenter des dates sans le fuseau horaire en utilisant Apache CXF?
j'ai une WSDL qui spécifie que le type d'un élément doit être xs:date.
quand J'utilise Apache CXF pour générer les classes Java, cela rend la variable javax.XML.type de données.XMLGregorianCalendar (tout bon jusqu'à présent).
lorsque CXF rend un document XML contenant ceci, il le rend sous cette forme (où -06:00 représente le fuseau horaire):
2000-01-18-06: 00
comment configurer CXF pour ne pas afficher le fuseau horaire?
4 réponses
Par défaut wsdl xsd:date
est tracé à XMLGregorianCalendar
. Si ce n'est pas ce que vous voulez, alors si vous utilisez CXF wsdl to java
outil puis vous pouvez fournir une liaison de fichiers à remplacer ce mappage par défaut:
<jaxws:bindings wsdlLocation="YOUR_WSDL_LOCATION"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='THE_NAMESPACE_OF_YOUR_SCHEMA']">
<jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:javaType name="java.util.Date" xmlType="xs:date"
parseMethod="org.apache.cxf.tools.common.DataTypeAdapter.parseDate"
printMethod="org.apache.cxf.tools.common.DataTypeAdapter.printDate"/>
</jxb:globalBindings>
</jaxws:bindings>
</jaxws:bindings>
vous pouvez Vous référer à http://cxf.apache.org/docs/wsdl-to-java.html section "Comment carte xsd:dateTime pour java.util.Date?"pour plus de détails.
GregorianCalendar gcal = new GregorianCalendar();
start = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
start.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
Ne me demandez pas pourquoi dans chaque partie de la logique saine-lors de la formation du xmlgregoriancalendar XS: date il conserve le fuseau horaire.
j'ai toujours pensé que le fuseau horaire pourrait être plus applicable à xs: dateTime, mais ce que je sais ... à propos des types.
Pour moi, ça n'a pas de sens d'avoir le fuseau horaire par défaut pour un type xs:date et c'est un problème à la gare de la logique.
pour compléter la réponse Filip (merci à lui!), peut-être que ça aidera certains d'entre vous ...
j'ai dû déclarer un nouveau XmlAdapter sur le champ concern date avec l'annotation @xmljavatypeadapter
public class YourDTO {
// ...
@XmlElement
@XmlSchemaType(name = "dateTime")
@XmlJavaTypeAdapter(type = XMLGregorianCalendar.class, value = XmlDateAdapter.class)
public Date yourDate;
// ...
}
l'adaptateur
public class XmlDateAdapter extends XmlAdapter<XMLGregorianCalendar, Date> {
@Override
public XMLGregorianCalendar marshal(Date date) throws Exception {
GregorianCalendar gcal = new GregorianCalendar();
gcal.setTime(date);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
return xmlDate;
}
// ...
message SOAP format de date avant
2017-04-18T00:00:00+02:00
message SOAP format de date après
2017-04-18T00:00: 00
j'ai trouvé mon commentaire ci-dessus de 2012 et maintenant je me sens obligé d'ajouter une réponse. J'apporte quelques modifications à un service web qui, malheureusement, doit continuer à fonctionner sur Java 6. On m'a demandé de supprimer la partie timezone/offset de tous les champs date et heure dans mes réponses XML. J'ai fait cela avec un fichier de liaison JAXB et 3 paires de méthodes d'adaptation pour les types XML date, time et datetime. Notez que ma solution utilise la bibliothèque JodaTime.
<?xml version="1.0" encoding="UTF-8"?>
<bindings
xmlns="http://java.sun.com/xml/ns/jaxb"
version="2.1"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<globalBindings>
<javaType
name="org.joda.time.DateTime"
xmlType="xs:dateTime"
parseMethod="com.jimtough.jaxb.DataTypeCondapter.parseDateTime"
printMethod="com.jimtough.jaxb.DataTypeCondapter.printDateTime" />
<javaType
name="org.joda.time.DateTime"
xmlType="xs:date"
parseMethod="com.jimtough.jaxb.DataTypeCondapter.parseDate"
printMethod="com.jimtough.jaxb.DataTypeCondapter.printDate" />
<javaType
name="org.joda.time.LocalTime"
xmlType="xs:time"
parseMethod="com.jimtough.jaxb.DataTypeCondapter.parseTime"
printMethod="com.jimtough.jaxb.DataTypeCondapter.printTime" />
</globalBindings>
</bindings>
package com.jimtough.jaxb;
import java.util.Date;
import javax.xml.bind.DatatypeConverter;
import org.joda.time.DateTime;
import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
/**
* My bizarrely named 'condapter' is a blend of the Java {@code DatatypeConverter}
* and the Apache CXF {@code DataTypeAdapter} that provides Jodatime {@code DateTime}
* support instead of {@code java.util.Date}.
*
* @author jtough
*/
public class DataTypeCondapter {
private DataTypeCondapter() {}
// Jim Tough - 2017-02-22
// JodaTime formatters claim to be threadsafe
private static final DateTimeFormatter DTF_DATE = ISODateTimeFormat.date();
private static final DateTimeFormatter DTF_DATETIME = ISODateTimeFormat.dateHourMinuteSecondMillis();
private static final DateTimeFormatter DTF_TIME = ISODateTimeFormat.hourMinuteSecondMillis();
public static DateTime parseDate(String s) {
if (s == null) {
return null;
}
Date date = DatatypeConverter.parseDate(s).getTime();
return new DateTime(date);
}
public static String printDate(DateTime dt) {
if (dt == null) {
return null;
}
return DTF_DATE.print(dt);
}
public static LocalTime parseTime(String s) {
if (s == null) {
return null;
}
Date date = DatatypeConverter.parseTime(s).getTime();
DateTime dt = new DateTime(date);
return dt.toLocalTime();
}
public static String printTime(LocalTime lt) {
if (lt == null) {
return null;
}
return DTF_TIME.print(lt);
}
public static DateTime parseDateTime(String s) {
if (s == null) {
return null;
}
Date date = DatatypeConverter.parseDateTime(s).getTime();
return new DateTime(date);
}
public static String printDateTime(DateTime dt) {
if (dt == null) {
return null;
}
return DTF_DATETIME.print(dt);
}
}