我正在尝试使用Java中的WSDL Web服务,最终将成为Eclipse插件。
我可以使用File> New> Other来选择“Web服务客户端”,但它会生成一堆文件,这些文件在Web服务更改时必须更改/重新生成,这相当垃圾。
到处都是我看到我看到各种各样的做事方式,但我无法让他们中的任何一个真正做我想做的事。
以下是一些代码:
String WsdlUrl = "http://localhost:port/path/to/wsdl";
ArrayList<String> args = new ArrayList();
args.add("arg1");
args.add("arg2");
// etc
Webservice ws = setupWebserviceObject( WsdlUrl );
Object result = ws.invoke("methodname",args);
System.out.println(result);
基本上我需要的是将“Webservice”,“setupWebserviceObject”和“invoke”更改为任何工作,而不需要预先生成的类,并且至少有任何其他烦人的绒毛。
看起来似乎不难做到,但到目前为止,我还没有找到一个明确的例子来说明这一点。
有人可以帮忙吗?
答案 0 :(得分:8)
我认为“简单”的概念与WSDL的所有内容都不兼容,但这里有一些例子:
Creating a dynamic web service client from WSDL using JAX-WS
Creating a web service client using the Apache Axis2 Axiom API
[注意]我在下面保留了原始的,被误解的回复,以防万一。
本文是您从WSDL实现服务的选项的一个很好的总结: 5 Techniques for Creating Java Web Services from WSDL
如果使用Java 6 +,JAX-WS Provider API实现可能是最简单的路径。
答案 1 :(得分:1)
一步一步的简单方法:
这是使用Apache CXF和Maven依赖关系管理完成的。
1 - 获取保存在文件中的服务的WSDL描述符。将它放在项目的resources文件夹中(如果你正在使用eclipse,文件夹应该在项目的Source文件夹列表中)。
2 - 在pom.xml中声明依赖项:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.7.7</version>
</dependency>
3 - 使用以下Maven插件生成java类:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.7.7</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/resources/WebService.wsdl.xml</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
4 - 使用以下代码拨打电话:
String methodName = "getSomethingFromMyWebService";
DynamicClientFactory dcf = DynamicClientFactory.newInstance();
Client client = dcf.createClient(ConsumeTest.class.getClassLoader().getResource("WebService.wsdl.xml"));
Object[] res = client.invoke(methodName,parameter1,parameter2, parameterN);
SomethingObject[] somethingObjectList = (SomethingObject[])res[0];
Class.forName(res.getClass().getName()).isArray();
for(SomethingObject so : somethingObjectList){
// do something!
}
5 - 利润!
注意:如果方法没有返回您必须转换为对象的列表,则返回它。
答案 2 :(得分:0)
我建议使用axis2命令行工具,最简单的方法是:
java2wsdl -cn完全限定类名称
wsdl2java -uri wsdlLocation -ss -sd -uw -g -o outputLocation
cd
进入outputLocation
并运行ant
将生成的.aar
文件放到WEB-INF/services
文件夹中以创建服务(如果您只是想要客户端则不需要)并将生成的存根文件复制到源文件夹。您可以使用YourServiceSkeleton
类来实现业务逻辑,并为客户端使用YourServiceStub
类