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?

16
demandé sur Donal Fellows 2011-05-26 22:18:06

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.

4
répondu peakit 2011-05-26 19:01:47
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.

64
répondu Filip 2011-08-18 15:27:45

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

5
répondu Hamarkhis 2016-04-19 12:33:11

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);
    }

}
0
répondu Jim Tough 2017-02-22 22:23:21