我必须生成一个WS客户端,我无法决定使用哪个插件。到目前为止,我的选择是:jaxb2-maven-plugin,axistools-maven-plugin和jaxws-maven-plugin。
答案 0 :(得分:32)
我必须生成一个WS客户端,我无法决定使用哪个插件。到目前为止,我的选择是:jaxb2-maven-plugin,axistools-maven-plugin和jaxws-maven-plugin。
首先, jaxb2-maven-plugin
并非真正用于生成WS客户端。消除。
其次,我个人I wouldn't use Axis even for client development only因此我不建议您使用 axistools-maven-plugin
。消除。
这给我们留下了JAX-WS RI和Apache CXF堆栈,以及它们各自的Maven插件:JAX-WS Maven Plugin(使用JAX-WS Maven插件的说明可以在Usage找到页面)和cxf-codegen-plugin。
关于利弊,我会这样总结:
最后,两个选择都不错,所以我建议稍微浏览一下这些链接并提出自己的看法。
答案 1 :(得分:5)
我使用jaxws-maven-plugin。在我看来,JAX-WS是WS的事实上的标准实现。它具有比AXIS更好的生成代码,并且更易于配置和实现。它有Maven和Spring支持。
从wsdl文件生成客户端代码,在pom.xml中:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<executions>
<execution>
<id>generate-reports-ws-code</id>
<phase>generate-sources</phase>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<!-- This property is used to support having multiple <execution> elements. The plugin has, from some reason, only one timestamp file per the all executions, thus if you have two executions, it doesn't know exactly when to recompile the code. Here we tell it explicitly to have one timestamp file per each execution --> <staleFile>${project.build.directory}/jaxws/stale/.staleFlag.reports</staleFile>
<packageName>com.acme.reports.ws.api</packageName>
<wsdlDirectory>${project.build.directory}/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>InternalReportsAPIService.wsdl</wsdlFile>
</wsdlFiles>
<verbose>true</verbose>
<sourceDestDir>${wsdl.generated.source.files.dir}</sourceDestDir>
</configuration>
</execution>
</executions>
</plugin>
用于创建客户端服务bean的接口(不是自动生成的):
public interface InternalReportsAPIServiceFactory {
public InternalReportsAPIService createInternalReportsAPIService();
}
它的Bean实现:
public class InternalReportsAPIServiceFactoryBean implements InternalReportsAPIServiceFactory {
private URL acmeReportsWsdlURL;
private final static QName V1_QNAME = new QName("http://internal.reports.api.acme.net/v1","InternalReportsAPIService");
@Override
public InternalReportsAPIService createInternalReportsAPIService() {
return new InternalReportsAPIService(acmeReportsWsdlURL, V1_QNAME);
}
public void setAcmeReportsWsdlUrl(String acmeReportsWsdlUrl) {
try {
this.acmeReportsWsdlURL = new URL(acmeReportsWsdlUrl);
} catch (MalformedURLException ex) {
throw new RuntimeException("Acme Reports WSDL URL is bad: "+ex.getMessage(), ex);
}
}
}
这个bean(用作Spring bean)的想法是有一个用于生成客户端服务代码的单例。它需要两个输入:WSDL url - 即实现WSDL的服务器的实际URL。客户端服务代码在构造时,在提供的URL处发送WSDL的get请求。然后,它根据驻留在自动生成的代码中的注释创建WSDL,并对其进行比较。我相信这样做是为了确保您正在运行正确的服务器版本。 所以,我已将url放在我的应用程序可访问的属性文件中,因此我在Spring应用程序上下文文件中初始化。
以下是使用工厂生成服务然后使用它的示例:
InternalReportsAPIService internalReportsAPIService = acmeReportsWSFactory.createInternalReportsAPIService();
InternalReportsAPI port = internalReportsAPIService.getInternalReportsAPIPort();
从这里开始,只需使用port变量来调用wsdl上的任何可用操作。
答案 2 :(得分:0)
需要Maven插件:
JAX-WS到WSDL 通过使用'java2ws'目标配置cxf-java2ws-plugin,从JAX-WS注释类生成WSDL文档。
将JAX-WS注释类所需的cxf-rt-frontend-jaxws依赖项和项目依赖项添加为插件依赖项。
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-java2ws-plugin</artifactId>
<version>2.5.1</version>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.medici.app</groupId>
<artifactId>services</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<className>com.medici.app.services.WebServiceBean</className>
<genWsdl>true</genWsdl>
</configuration>
<goals>
<goal>java2ws</goal>
</goals>
</execution>
</executions>
</plugin>
WSDL 2 Java 通过使用'wsdl2java'目标配置cxf-codegen-plugin,从WSDL文档生成Java客户端。
'-p'参数指定包类。
生成的类将放在target / generated-sources / cxf文件夹中。
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>process-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/WebService.wsdl</wsdl>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>com.medici.app.client.model</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>