comment remplacer XmlGregorianCalendar par Date?

j'ai à exposer un ejb de la couche de service par jax-ws .

j'ai généré le service web en utilisant jax-ws et wsimport mais je suis arrêté par une chose étrange ; la Date est mappée à XmlGregorianCalendar . Est-il possible d'utiliser java Date classique à la place ? Pouvez-vous me montrer la bonne façon de procéder ?

Merci . Modifier: cette liaison fichier que j'ai utilisé : merci, j'ai légèrement modifié votre xml et l'ai attaché avec netbeans à la webservice et ça a marché . C'est la liaison que j'ai utilisée :

<jaxws:bindings  node="wsdl:definitions/wsdl:types/xsd:schema"
                 xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"

                                xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"

                                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

                                xmlns:xsd="http://www.w3.org/2001/XMLSchema" wsdlLocation="../wsdl/localhost_8080/web_test/Testor.wsdl" >


 <jaxb:globalBindings>
          <jaxb:javaType   name="java.util.Date"
        xmlType="xsd:dateTime"
        parseMethod="lol.XsdDateTimeConverter.unmarshal"
        printMethod="lol.XsdDateTimeConverter.marshalDateTime"        
          /><jaxb:javaType 
        name="java.util.Date"
        xmlType="xsd:date"
        parseMethod="lol.XsdDateTimeConverter.unmarshal"
        printMethod="lol.XsdDateTimeConverter.marshalDate"
        />
      </jaxb:globalBindings>


</jaxws:bindings>
21
demandé sur hunter99 2012-06-20 01:19:53

2 réponses

non testé, mais ça devrait marcher. Créer d'abord une telle classe:

import javax.xml.bind.DatatypeConverter;

public class XsdDateTimeConverter {

    public static Date unmarshal(String dateTime) {
        return DatatypeConverter.parseDate(dateTime).getTime();
    }

    public static String marshalDate(Date date) {
        final GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        return DatatypeConverter.printDate(calendar);
    }

    public static String marshalDateTime(Date dateTime) {
        final GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(dateTime);
        return DatatypeConverter.printDateTime(calendar);
    }

}

puis ajoutez ceci au fichier personnalisé xjb :

<javaType
        name="java.util.Date"
        xmlType="xs:dateTime"
        parseMethod="XsdDateTimeConverter.unmarshal"
        printMethod="XsdDateTimeConverter.marshalDateTime"
        />
<javaType
        name="java.util.Date"
        xmlType="xs:date"
        parseMethod="XsdDateTimeConverter.unmarshal"
        printMethod="XsdDateTimeConverter.marshalDate"
        />
</globalBindings>

non testé, mais ça devrait marcher. Basé sur ma réponse ici: JAX-WS et Joda-Time?

19
répondu Tomasz Nurkiewicz 2017-05-23 12:30:37

Merci Tomasz. La solution ci-dessus fonctionne.

mais wsimport ajoute également son ensemble d'adaptateurs comme Adapteur1.java and Adapter2.java avec son paquet org.w3._2001.xmlschema , qui ne correspond pas vraiment à ma propre structure de paquet.

j'ai trouvé un moyen de changer le nom de ce paquet en utilisant une autre liaison jaxb. En fait, je l'ai cherché beaucoup et ne pouvait pas trouver aussi facilement, donc je l'ajoute ici pour quiconque cherche la de même.

ajouter la liaison suivante dans le wsimport en utilisant la liaison " - B.xml". Notez que wsimport peut fonctionner avec plusieurs fichiers de liaison.

de liaison.xml le contenu ci-dessous:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.w3.org/2001/XMLSchema"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  jaxb:version="2.0">
  <annotation><appinfo>
    <jaxb:schemaBindings>
      <jaxb:package name="com.abc.xyz.utils"/>
    </jaxb:schemaBindings>
  </appinfo></annotation>
</schema>
1
répondu urOutsourced 2016-08-27 11:24:30