2011-04-22 85 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>