gpt4 book ai didi

java - wsimport 不会为集合生成 setter

转载 作者:搜寻专家 更新时间:2023-11-01 03:12:56 24 4
gpt4 key购买 nike

我使用以下 Ant 任务为 Web 服务端点生成客户端代码:

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

这会生成客户端用来将数据传递给网络服务的类,例如

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 属性,生成的类不包含 setter,因此客户端必须通过以下方式访问它:

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

然而,缺少 setter 意味着此类无法使用依赖于 JavaBeans 约定的各种工具(例如 Dozer),因此我想强制 wsimport 生成 setter。我找到了一个 thread这表明您可以通过将以下内容添加到 Ant 任务来强制生成 setter

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

但是,这个线程已经很老了,上面的似乎不再起作用了。

最佳答案

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

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

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

对于使用 cxf-codegen-plugin 的 Maven 用户,它看起来像这样:

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

关于java - wsimport 不会为集合生成 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5757139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com