2

我想知道是否有人可以推荐一个好的库来生成 java webservices 存根作为客户端。

目前我正在使用一个产品,它嵌入了一个只需要 WSDL 的生成器,然后创建所需的类和方法。

我的问题是它会引发警告,并且不会为我尝试使用的某些 Web 服务创建任何方法。

真正的问题是它没有解释问题是什么(所以我可以和 web 服务的所有者一起修改它),也不让我修改输出,这样我就可以自己解决问题。

然而,网络服务的所有者(因为这发生在几个不同的 ws 上)说他们的 ws 运行良好,实际上如果我使用soapUI,它们实际上可以工作!!!

我快速浏览了soapUI它自己使用的库,我看起来很有希望。

我知道有Axis 应该做这项工作,但我担心的是我失败的生成器已经在使用那个库(这让我觉得它会再次失败)

最近我不知道这两个库是生成java源存根还是只有类似的方法

Object [] args = ...;
service.inkvoke("updateCustomer", args );

当我想要的是这样的:

CustomerWs cws = ....
cws.updateCustomer(custId, custName, custAddress /*etc*/ );

那么,任何人都可以推荐一个好的ws 存根生成器吗?

我即将自己手动编码,但肯定需要几天才能被接受

4

6 回答 6

3

当您提到“Axis”时要非常小心:Apache Axis 1在 2006 年初被放弃,因为线程安全错误导致死锁和 CPU 旋转(我们都经历过这两种情况)。你会深深后悔使用它。 Apache Axis 2完全重写,可能值得一看。但我建议您先看看Apache CXFGlassfish Metro

更新:这里是关于死锁100% CPU 自旋的错误报告。这是 Cyrille Le Clerc三年前提出的补丁,从未承诺过。

我们通过直接用 Java 重新编码我们的客户端来消除我们的死锁和旋转。然后 Axis 服务器拒绝与我们交谈,发回 HTTP 500 错误。我们需要谎称我们是 Axis 客户才能得到适当的回应。SOAP 互操作性不是 Axis 1 团队的优先事项。

于 2009-06-18T02:50:28.213 回答
2

你目前在用什么?我使用 Axis Wsdl2Java 作为 Ant 任务。它生成您想要的存根类型。效果很好,尽管在 Eclipse 中设置运行构建的类路径有点麻烦(我需要跟踪和包含一些 jar)。在我的 ant 构建文件中,它看起来像这样:

<taskdef name="axis-wsdl2java" classname="org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask" />
<target name="foo">
<axis-wsdl2java
              output="${build.dir}"
              testcase="false"
              verbose="true"
              typemappingversion="1.2"
              url="http://ws.domain.com/url/of/WebService?wsdl" />
<!-- Compile, etc... -->
</target>
于 2009-06-18T02:03:14.207 回答
2

我喜欢 Apache CXF——它通过一个插件很好地与 Maven 集成,并且可以正常工作。我用它来生成客户端存根代码已经有一段时间了,在我工作的最后一家公司,他们也将它用于 WS 的服务器部分。

在我使用 CXF + Maven + Subversion 处理的最后一个项目中,我们没有在 Subversion 中包含生成的类,只有 WSDL 文件的副本——存根类是在 Maven 的“生成”目标中生成的。

于 2009-06-18T04:23:34.440 回答
1

Apache Axis 2 是要走的路……尽管您可能需要尝试一下才能正确使用它。这可能是最常见的方法。也许您使用的工具是基于 Axis 1 的?

于 2009-06-18T01:53:54.273 回答
1

我肯定会建议使用基于标准 API 的东西。那将意味着 JAX-WS API。Apache CXF 和 Metro 是两个主要的 JAX-WS 实现,尽管 JBoss 也有一个实现。Axis2 有一个未经认证的实现,但不支持代码生成。

使用基于标准的 API 的最佳部分是,如果您在产品上遇到问题,您可以尝试另一个。在我看到的许多情况下,其他产品也不起作用,但会吐出不同的错误消息或类似的信息,帮助诊断它确实是我们自己的代码或 wsdl 中的问题。

此外,JAX-WS 直接内置于 Java6 中。如果您打算在 Java6 上运行,则可以使用它而不必处理额外的 jar 等。

于 2009-06-18T14:40:39.720 回答
0

作为 Metro ( http://metro.dev.java.net )一部分的最新 JAX-WS是一个非常好的抽象层。需要一点调整,但对我来说,它比其他一些选项更直观。

于 2009-06-18T01:54:51.417 回答