2017-05-18 2 views
0

Ich erstelle einen Apache CXF-Client aus einer WSDL, die von einer Drittpartei bereitgestellt wurde. Wenn ich den Webdienst im Test ausfühle, stelle ich fest, dass die Ausgabe des Dienstes nicht der WSDL entspricht.Apache CXF-Client generiert von ungenauer WSDL

Bisher scheint es, wie für einige Elemente, wird die WSDL nicht als nillable=true definieren, während der Dienst sie tatsächlich zurückkehrt mit xsi:nil="true"

Mein CXF-Client nicht die zurück xml entordnen und explodiert.

Ich habe es in gewissem Umfang (durch die Bearbeitung der gelieferten WSDL) gearbeitet, aber ich sehe das nicht als eine praktikable Lösung. Die dritte Partei weigert sich auch, ihre Service- und WSDL-Definitionen in Einklang zu bringen, da andere Kunden dies in der Produktion korrekt handhaben.

Also, gibt es eine Möglichkeit, das Unmarshalling der Antwort weniger streng zu machen? Mit welchen anderen Möglichkeiten könnte ich dieses Problem angehen?

Das Schema Definition eines der Felder, die mir ein Problem gibt, ist wie folgt:

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

Dieses Feld wird durch den Dienst zurückgegeben wird (wenn in SoapUI genannt) als <cardExpireDate xsi:nil="true"/>

Wenn mein Code versucht, den Webdienst anzurufen, erhalte ich den folgenden Fehler (der weit über den Stack-Trace hinausgeht, aber ich glaube, dass er die Wurzel des Problems ist)

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) 

und Spalte 1515 des Dokuments zu analysieren ich versuche

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

Haben Sie die Schema-Validierung aktiviert, indem Sie die Schema-Validierung-aktiviert auf True setzen? Dann schalte es einfach aus. Es ist eher eine JAXB als eine CXF Frage. Können Sie ein konkretes Beispiel und eine Fehlermeldung posten? –

+0

@DennisKieselhorst: Ich glaube nicht, dass ich die Schema-Validierung eingeschaltet habe - ich gehe nur mit den Standardwerten und ich denke, ich habe gelesen, dass es standardmäßig deaktiviert war. Ich werde die Frage mit etwas detaillierteren Details aktualisieren. – DaveH

Antwort

0

Wenn nur Datumsfelder ein Problem sind, können Sie eine benutzerdefinierte Bindung verwenden org.apache.cxf.xjc.runtime zu verwenden. DataTypeAdapter von cxf-xjc-Laufzeit:

<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> 

Werfen Sie einen Blick auf die FAQ-Bereich am unteren Rand des http://cxf.apache.org/docs/wsdl-to-java.html, wenn Sie nicht wissen, wie die Bindung anzuwenden.

Verwandte Themen