使用Java消费wsdl Web服务的简单示例?

时间:2011-08-21 19:48:26

标签: java web-services wsdl jax-ws

我正在尝试使用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”更改为任何工作,而不需要预先生成的类,并且至少有任何其他烦人的绒毛。

看起来似乎不难做到,但到目前为止,我还没有找到一个明确的例子来说明这一点。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:8)

我认为“简单”的概念与WSDL的所有内容都不兼容,但这里有一些例子:

[注意]我在下面保留了原始的,被误解的回复,以防万一。

本文是您从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