2017-05-18 3 views
0

Je crée un client Apache CXF à partir d'un WSDL fourni par un tiers. Lorsque j'exerce le service web en test, je trouve que la sortie du service n'est pas conforme au WSDL.Client Apache CXF généré à partir d'un WSDL inexact

Jusqu'à présent, il semble que, pour certains éléments, le WSDL ne les définit pas comme nillable=true alors que le service ne les renvoie en fait avec xsi:nil="true"

client Mon CXF ne parvient pas à unmarshall le xml retourné et explose.

J'ai travaillé dans une certaine mesure (en éditant le fichier wsdl fourni), mais je ne vois pas cela comme une solution viable. Les tiers refusent également d'aligner leurs définitions de service et de wsdl, affirmant que d'autres clients gèrent correctement cette fonction en production.

Alors, y a-t-il un moyen de rendre le démantèlement de la réponse moins strict? Quelles autres voies pourrais-je aborder ce problème?

La définition de schéma de l'un des domaines qui me donne un problème est la suivante:

<xsd:element name="cardExpireDate" type="xsd:date"></xsd:element>

Ce champ est retourné par le service (lorsqu'il est appelé à SoapUI) comme <cardExpireDate xsi:nil="true"/>

Lorsque mon code tente d'appeler le service Web, j'obtiens l'erreur suivante (qui est en bas de la trace de la pile mais je crois que c'est la racine du problème)

Caused by: javax.xml.bind.UnmarshalException 
- with linked exception: 
[com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 1515; ] 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:483) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:417) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:394) 
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.doUnmarshal(JAXBEncoderDecoder.java:855) 
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.access$100(JAXBEncoderDecoder.java:102) 

snip .... 

Caused by: javax.xml.bind.UnmarshalException: 
- with linked exception: 
[java.lang.IllegalArgumentException: ] 
    ... 92 more 
Caused by: java.lang.IllegalArgumentException: 
    at org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parseYear(Unknown Source) 
    at org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(Unknown Source) 

et la colonne 1515 du document que je suis en train d'analyser est

<cardExpireDate xsi:nil="true"/> 
+0

Avez-vous activé la validation du schéma en définissant schema-validation-enabled sur true? Ensuite, éteignez-le simplement. C'est plus une question JAXB qu'une question CXF. Pouvez-vous poster un exemple concret et un message d'erreur? –

+0

@DennisKieselhorst: Je ne pense pas avoir activé la validation de schéma - je vais juste avec les valeurs par défaut et je pense que j'ai lu que c'était désactivé par défaut. Je vais mettre à jour la question avec des détails plus précis. – DaveH

Répondre

0

Si seuls les champs de date sont un problème, vous pouvez utiliser une liaison personnalisée à utiliser org.apache.cxf.xjc.runtime. DataTypeAdapter de CxF-xjc-exécution:

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

Jetez un oeil à la FAQ en bas de http://cxf.apache.org/docs/wsdl-to-java.html si vous ne savez pas comment appliquer la liaison.