2015-12-15 2 views
12

Я создал клиент WebService с CXF с xew plugin для списка разворачиванияCxF wsdl2java Нулевой вход в списке исчезают

Проблема заключается в том, что null в списке исчезают. т.д .:

У меня есть запрос с List<String> с струнных и null -Посещение

Когда запрос в настоящее время поступает на сервер он содержит только строки а не null запись. Таким образом, в списке примеров есть всего 2 записи.

Вот пример WSDL:

[..] 
<!-- 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> 

Я использую Maven для создания клиенту Ws

<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

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

запрос Образец:

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

Есть ли способ, что null запись до сих пор присутствует в ServerSide?

+0

Вы должны опубликовать конфигурацию своего плагина и образец запроса. – approxiblue

+0

@approxiblue Я добавил пример кода и мою конфигурацию. – jmattheis

+0

Может ли настройка minOccurs = "1" для сложного типа ArrayOfRole помочь? – cacert

ответ

2

Проблема заключается в том, что jaxb-xew-plugin генерирует код, который пропускает nillable = true для XmlElement Списка.

Сгенерировано с помощью плагина:

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

Если вы попробуете, с добавлением nillable=true, он будет работать:

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

Так что, похоже, плагин отсутствует атрибут nillable для обернутых значений.

Я думаю, что проблема кроется в this code part, где XmlElement «поднимается» на внешний элемент, а атрибут nillable не учитывается.

Добавление следующего фрагмента кода на указанные части коды будет решить вашу проблему и генерировать рабочий код:

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

Проблема, которая обсуждалась в этом вопросе решается в версии 1,7 из JAXB-xew- плагин. This issue отслеживает этот случай, here - это релизы.

0

Я не уверен в этом, но может быть, что generateElementProperty в привязках JAXB может вызвать проблему? Согласно documentation, если для этого свойства установлено значение false, JAXB не сможет обойти все XML-документы. Если установлено значение истинно, вы будете иметь дело с JAXBElement класса, но, как говорится в документации:

Тип JAXBElement туда и обратно в XML-представление имени элемента поперек/операции распаковать маршалом.

Проверьте примеры на этой странице, это может помочь.

Смежные вопросы