2015-12-15 5 views
12

ich einen Webservice-Client mit cxf mit den xew plugin für die Liste erstellt habe AbwickelnCXF WSDL2Java null Eintrag in der Liste verschwindet

Das Problem ist, dass die null in der Liste verschwinden. Z. B .:

Ich habe eine Anfrage mit einem List<String> mit Streichern und einem null -Das

Wenn jetzt die Anfrage an den Server kommt es nur die Strings nicht der null Eintrag enthält. Es gibt also nur 2 Einträge in der Beispielliste.

Hier ist ein Beispiel für die WSDL-Datei:

[..] 
<!-- the request --> 
<xsd:element name="createGroup"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string"/> 
      <xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="ns2:ArrayOfRole"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
[..] 
<!-- the list which will be unwrapped --> 
<xsd:complexType name="ArrayOfRole"> 
    <xsd:sequence> 
     <xsd:element maxOccurs="unbounded" minOccurs="0" name="Role" nillable="true" type="xsd:String"/> 
    </xsd:sequence> 
</xsd:complexType> 

ich Maven bin mit dem WS-Client

<properties> 
    <cxf.version>3.0.5</cxf.version> 
    <jaxbBasic.version>0.6.5</jaxbBasic.version> 
</properties> 
[..] 
<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.version}</version> 
    <executions> 
     <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <sourceRoot>src/main/java</sourceRoot> 
       <defaultOptions> 
        <bindingFiles> 
         <bindingFile>${basedir}/jaxbBindings.xml</bindingFile> 
         <bindingFile>${basedir}/jaxwsBindings.xml</bindingFile> 
        </bindingFiles> 
        <extraargs> 
         <!-- xew plugin for unwrapping list wrappers types NOTE: the args need to be over the others otherwise there are compilation errors --> 
         <extraarg>-xjc-Xxew</extraarg> 
         <extraarg>-xjc-Xxew:instantiate lazy</extraarg> 

         <!-- Generate toString, equals, hashcode methods --> 
         <extraarg>-xjc-Xts:style:de.company.tostring.CustomToStringStyle.DEFAULT</extraarg> 
         <extraarg>-xjc-Xequals</extraarg> 
         <extraarg>-xjc-XhashCode</extraarg> 
        </extraargs> 
       </defaultOptions> 
       <wsdlRoot>${ws.dirAbsolute}</wsdlRoot> 
       <includes> 
        <include>*.wsdl</include> 
       </includes> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.cxf.xjcplugins</groupId> 
      <artifactId>cxf-xjc-ts</artifactId> 
      <version>${cxf.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.jvnet.jaxb2_commons</groupId> 
      <artifactId>jaxb2-basics</artifactId> 
      <version>${jaxbBasic.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.github.jaxb-xew-plugin</groupId> 
      <artifactId>jaxb-xew-plugin-fixed</artifactId> <!-- this is a custom version with a small modification see https://github.com/dmak/jaxb-xew-plugin/issues/44 --> 
      <version>1.7-SNAPSHOT</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.xml.bind</groupId> 
      <artifactId>jaxb-xjc</artifactId> 
      <version>2.2.11</version> 
     </dependency> 
    </dependencies> 
</plugin> 

jaxbBindings.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxb:globalBindings generateElementProperty="false"/> 
</jaxb:bindings> 

jaxwsBindings.xml

zu erzeugen
<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
      xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
      xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 
</jaxws:bindings> 

Eine Probe Anfrage:

final CreateGroup create = new CreateGroup(); 
create.setIn0("newgroup"); 
final List<String> roles = new ArrayList<String>(); 
roles.add("testrole"); 
roles.add(null); 
roles.add("testrole2"); 
create.setIn1(roles); 
final SamplePortType proxy = ..; 
proxy.createGroup(create); 

Gibt es eine Möglichkeit, dass der null Eintrag noch in dem server vorhanden sein wird?

+0

Sie sollten Ihre Plugin-Konfiguration und eine Beispielanfrage veröffentlichen. – approxiblue

+0

@approxiblue Ich habe Beispielcode und meine Konfiguration hinzugefügt. – jmattheis

+0

Darf möglicherweise minOccurs = "1" für ArrayOfRole komplexen Typ kann helfen? – cacert

Antwort

2

Das Problem ist, dass die jaxb-xew-plugin Code generiert, nillable = true für die XmlElement der Liste vermisst.

vom Plugin generiert:

@XmlElementWrapper(required = true, nillable = true) 
@XmlElement(name = "Role", namespace = "http://www.stackoverflow.com/example") 
protected List<String> in1; 

Wenn Sie versuchen, mit Zusatz von nillable=true, wird es funktionieren:

@XmlElementWrapper(required = true, nillable = true) 
@XmlElement(name = "Role", namespace = "http://www.stackoverflow.com/example", nillable = true) 
protected List<String> in1; 

So scheint es, das Plugin für verpackte Werte der nillable Attribut fehlt.

Ich denke, das Problem liegt in this code part, wo das XmlElement zu einem äußeren Element "aufgehoben" und das nillable Attribut ist weggelassen.

Hinzufügen von dem folgenden Codeausschnitt zu dem genannten Codeteil wird Ihr Problem lösen und Arbeits Code zu generieren:

JExpression nillable = getAnnotationMemberExpression(xmlElementOriginalAnnotation, "nillable"); 
if (nillable != null) { 
    xmlElementAnnotation.param("nillable", nillable); 
} 

Das Problem in dieser Frage diskutiert, wie die Version gelöst 1,7 des jaxb-xew- Plugin. This issue verfolgt diesen Fall, here sind die Releases.

0

Ich bin mir nicht sicher, aber könnte es sein, dass die generateElementProperty in den JAXB-Bindungen das Problem verursachen können? Laut der documentation, wenn diese Eigenschaft auf false festgelegt ist, wird JAXB nicht in der Lage sein, alle XML-Dokumente Roundtrip. Wenn auf true gesetzt, werden Sie mit JAXBElement Klasse zu tun haben, sondern, wie die Dokumentation sagt:

Der JAXBElement Typ die XML-Darstellung des Namenselement über eine Abstellungs/Marschall Betrieb Rundreisen.

Überprüfen Sie die Beispiele auf dieser Seite, es kann helfen.

Verwandte Themen