2011-04-22 75 views
4

我用下面的Ant任务生成客户端代码的Web服务端点制定者:的wsimport不会生成集合

<wsimport wsdl="target/classes/META-INF/wsdl/MyService.wsdl" 
       sourcedestdir="target/wsimport" 
       verbose="true" 
       xnocompile="false" 
       xendorsed="true" 
       destdir="target/classes" 
       keep="true" 
       package="com.example.client.jaxws" 
       wsdlLocation="/META-INF/wsdl/MyService.wsdl" /> 

这会生成客户端使用将数据传递到Web服务类,例如

class Foo { 

    String name; 
    List<String> bars; 

    public void setName(String name) { 
    this.name = name; 
    } 

    public String getName() { 
    return name; 
    } 

    public List<String> getBars() { 
    return bars; 
    } 
} 

注意,为bars属性生成的类不包括二传手,所以客户端必须通过访问它:

someFoo.getBars().add("val"); 

但是没有一个setter意味着该类赢得”不能使用依赖于JavaBeans约定的各种工具(比如Dozer),所以我想强制wsimport来生成setter。我发现了一个thread,指示您可以通过添加强制setter产生以下的Ant任务

<xjcarg value="-Xcollection-setter-injector"/> 

然而,这个线程是很老了,上面似乎没有工作了。

回答

1

该功能由插件“jaxb2 commons collection setter injector”插件提供。你是否在你的xjc classpath中包含了这个jar?

+0

我想你意味着一个蚂蚁插件? – 2011-04-26 08:05:30

+0

@唐 - 不,我的意思是一个jaxb插件 – jtahlborn 2011-04-26 11:23:19

2

您需要在构建类路径中包含jaxb xjc扩展库,并使用xjcArg的-Xsetters。这将导致您生成的存根具有您的List对象的setter。

对于Maven用户与jaxws-maven-plugin,它看起来像这样:

 <!-- generates webservice client stubs using wsimport --> 
     <plugin> 
      <groupId>org.jvnet.jax-ws-commons</groupId> 
      <artifactId>jaxws-maven-plugin</artifactId> 
      <version>${jaxws-maven-plugin.version}</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>wsimport</goal> 
        </goals> 
        <configuration> 
         <wsdlDirectory>${basedir}/src/main/resources/${resources-folder}/wsdl/v1</wsdlDirectory> 
         <wsdlFile>${wsdlFileName}</wsdlFile> 
         <bindingFiles> 
          <bindingFile>${basedir}/src/main/resources/jaxb-bindings.xml</bindingFile> 
         </bindingFiles> 
         <vmArgs> 
          <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg> <!-- necessary for JDK 8 --> 
         </vmArgs> 
         <xjcArgs> 
          <xjcArg>-Xsetters</xjcArg> 
         </xjcArgs> 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 
       <!-- put xjc-plugins on the jaxws-maven-plugin's classpath --> 
       <dependency> 
        <groupId>org.jvnet.jaxb2_commons</groupId> 
        <artifactId>jaxb2-basics</artifactId> 
        <version>0.9.5</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

而对于Maven用户与cxf-codegen-plugin它看起来像这样:

 <!-- generates webservice client stubs using CXF framework--> 
     <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>${project.build.directory}/generated-sources/cxf</sourceRoot> 
         <wsdlOptions> 
          <wsdlOption> 
           <wsdl>${adapter.api.wsdlFileName}</wsdl> 
           <bindingFiles> 
            <bindingFile>${basedir}/src/main/resources/jaxb-bindings.xml</bindingFile> 
           </bindingFiles> 
           <extraargs> 
            <extraarg>-xjc-Xsetters</extraarg><!-- needed so that setters for lists are generated --> 
           </extraargs> 
          </wsdlOption> 
         </wsdlOptions> 
        </configuration> 
        <goals> 
         <goal>wsdl2java</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <!-- plugin needed to customize cxf genrated classes --> 
       <dependency> 
        <groupId>org.jvnet.jaxb2_commons</groupId> 
        <artifactId>jaxb2-basics</artifactId> 
        <version>0.9.4</version> 
       </dependency> 
      </dependencies> 
     </plugin>