我正在使用 wsdl2java 来生成服务。生成的参数如下:
-p com.dummy.tst.service -u -f -sp -s -b -ssi -d xmlbeans -uri /some/path/service.wsdl -ss -g -sd -o /some/path/gen
生成后,我得到了一个 services.xml 文件,其行如下
<parameter name="ServiceClass">com.dummy.tst.service.TestSoapBindingImpl</parameter>
然后在 gen 目录中,我得到了带有方法列表的 TestSoapBindingImpl.java,但每个方法定义如下
throw new java.lang.UnsupportedOperationException("Please implement " + this.getClass().getName() + "#myMethod");
还有一个 TestSoapBindingStub.java 文件,它实际上包含已实现的方法。在 axis-1 中只有一个包含方法描述和实现的文件,在 axis-2 中我有 2 个文件。
我应该如何处理这些文件?指定为默认服务方法容器(在 services.xml 中)的 Impl 文件仅包含虚拟对象,因此我无法使用已部署的服务,并且在 services.xml 中将 TestSoapBindingImpl 替换为 TestSoapBindingStub 也不会产生所需的结果。
最佳答案
TestSoapBindingStub.java
用于客户端。它包含调用远程系统上的 Web 服务的代码。
在服务端,每次收到请求时,Axis2 都会创建一个在 services.xml
中指定类型的对象作为 ServiceClass。然后,它将使用客户端提供的对象来调用 ServiceClass 对象中所请求的函数。
使用 wsdl2java 生成的代码,对服务的每次调用都会创建一个 om.dummy.tst.service.TestSoapBindingImpl 类型的对象,正如您所注意到的,该对象将为每个调用抛出一个异常称呼。有两种方法可以提供有效的服务。
您可以使用已有的
TestSoapBindingImpl.java
文件作为起点。从每个函数中删除throws
行,并用您在收到请求时实际想要执行的代码填充每个函数主体。或者,您可以使用
services.xml
作为起点。定义您自己的类作为服务类。将对 com.dummy.tst.service.TestSoapBindingImpl 的引用替换为对您自己的服务类名称的引用。 wsdl2java 可能生成一个名为 TestSoapBindingSkeleton.java 之类的文件,它定义了服务类应实现的接口(interface)。您的自定义服务类应该实现此接口(interface)。
我一直在从事的项目使用方法#2。我们编写自己的服务类来实现骨架接口(interface)。将服务打包到 AAR 文件中时,您可以将 services.xml
文件包含在 AAR 中。我们的打包规则对生成的 services.xml
执行文本替换,以使用我们的服务类名称更新 ServiceClass。
关于java - Axis2实现和 stub 生成问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12565000/