2010-05-31 4 views
2

Nous avons un EJB, jws-anotated comme un service Web. Il a un modèle pojo assez complexe qui génère un xsd tout aussi complexe. Les pojos contiennent de nombreux java.util.Date. Tout cela correspond à xs: dateTime.Mappage java.util.Date à xs: date au lieu de xs: dateTime dans JAX-WS

Ce service est utilisé comme "service métier" dans Oracle (BEA) OSB (AquaLogic). Nous avons également un "service proxy" que nous mappons à la BS avec XQuery (la façon OSB/AquaLogic). Le fichier xsd du service proxy a xs: date pour les champs correspondants. Pour une raison quelconque, l'implémentation de XQuery par Oracle ne prend pas en charge la conversion de xs: date en xs: dateTime (!).

Je pourrais résoudre ceci en transtypant xs: string et en concaténant avec "T00: 00: 00", cependant j'essaierais plutôt d'obtenir JAX-WS pour générer un xsd avec xs: date à la place. Seulement, je ne peux pas trouver d'informations sur la façon de le faire (anotations?).

Quelqu'un peut-il me donner un indice?

Cordialement, Lars

Répondre

2

Je ne sais pas spécifiquement sur Oracle, mais pour CXF il existe des utilitaires pour faire ce mapping. Vous pourriez être en mesure de trouver un adaptateur similaire pour votre config. Jetez un oeil à la page suivante. http://cxf.apache.org/docs/wsdl-to-java.html.

Il existe deux options selon que vous avez votre schéma dans le WSDL ou dans une URL distincte (je comprends que vous êtes dans une première configuration Java, mais que vous essayez de faire la conversion du côté du proxy).

<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:dateTime" 
         parseMethod="org.apache.cxf.tools.common.DataTypeAdapter.parseDateTime" 
         printMethod="org.apache.cxf.tools.common.DataTypeAdapter.printDateTime"/> 
     </jxb:globalBindings> 
    </jaxws:bindings> 
</jaxws:bindings> 

XSD: en dehors, la syntaxe JAXB

<jxb:bindings version="2.0" 
       xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <jxb:bindings schemaLocation="file:<path><name>.xsd" node="/xs: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:dateTime" 
        parseMethod="org.apache.cxf.tools.common.DataTypeAdapter.parseDateTime" 
        printMethod="org.apache.cxf.tools.common.DataTypeAdapter.printDateTime"/> 
    </jxb:globalBindings> 
    </jxb:bindings> 
</jxb:bindings> 

Dans notre CXF, nous utilisons la cartographie pour éviter d'utiliser le calendrier grégorien, mais vous pouvez probablement l'utiliser pour faire le casting.