【问题标题】:Simple example of consuming wsdl webservice with Java?使用 Java 使用 wsdl webservice 的简单示例?
【发布时间】:2011-08-21 19:48:26
【问题描述】:

我正在尝试使用 Java 中的 WSDL Web 服务,最终将成为 Eclipse 插件。

我可以使用 File>New>Other 选择“Web Service Client”,它可以工作,但它会生成一堆文件,当 webservice 更改时,这些文件必须更改/重新生成,这相当垃圾。

在我所看到的每一个地方,我都能看到各种各样的做事方式,但我无法让它们中的任何一个真正做我想做的事情。

这里有一些代码:

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”更改为任何可行的方式,而不需要预先生成的类,并且尽量减少任何其他烦人的绒毛。

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

谁能帮忙?

【问题讨论】:

  • 我也在寻找同样的问题..你有解决方案吗?

标签: java web-services wsdl jax-ws


【解决方案1】:

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

[注意] 我将原始的、被误解的回复保留在下面,以防它对任何人有所帮助。

这篇文章很好地总结了您从 WSDL 实现服务的选项: 5 Techniques for Creating Java Web Services from WSDL.

如果您使用的是 Java 6+,那么 JAX-WS Provider API 实现可能是最简单的方法。

【讨论】:

  • 除非我看错了,否则该页面是关于在 Java 中创建新的 Web 服务?那不是我需要的。我在问使用现有 web 服务 的 Java 代码是什么。
  • 啊,我错了,我以为你是想从 WSDL 实现一个 Web 服务,而不是使用它。
  • 我猜问题中的“createWebservice”可能令人困惑 - 我已将其重命名为“setupWebserviceObject”。
  • WSDL 消费很简单。使用其他工具,用于其他编程语言。
【解决方案2】:

一步一步的简单方法:

这是使用 Apache CXF 和 Maven 依赖管理制作的。

1 - 获取保存在文件中的服务的 WSDL 描述符。将它放在项目的资源文件夹中(如果您使用的是 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 - 利润!

注意:如果该方法没有返回列表,则必须将其强制转换为它返回的对象。

【讨论】:

    【解决方案3】:

    我会推荐使用axis2命令行工具,最简单的:

    java2wsdl -cn 全限定类名

    wsdl2java -uri wsdlLocation -ss -sd -uw -g -o outputLocation

    cd 进入 outputLocation 并运行 ant

    将生成的.aar 文件放入WEB-INF/services 文件夹以创建服务(如果您只需要客户端,则不需要)并将生成的存根文件复制到您的源文件夹。可以使用YourServiceSkeleton类实现业务逻辑,客户端使用YourServiceStub

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 2019-08-02
      • 2016-03-02
      • 2012-06-09
      • 2013-07-18
      相关资源
      最近更新 更多