Axis2实现和存根生成问题

时间:2012-09-24 12:25:11

标签: java apache wsdl axis2 wsdl2java

我正在使用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文件,它实际上包含已实现的方法。在轴-1中,只有一个文件包含方法描述和实现,而在轴-2中我有2个文件。

我该怎么处理这些文件? Impl文件,指定为默认服务方法容器(在services.xml中)只包含虚拟对象,因此我不能使用已部署的服务,并且在services.xml中用TestSoapBindingStub替换TestSoapBindingImpl也不会导致所需的结果。

1 个答案:

答案 0 :(得分:1)

TestSoapBindingStub.java适用于客户。它包含在远程系统上调用Web服务的代码。

在服务方面,每次请求进入时,Axis2都会创建一个services.xml中指定类型的对象作为ServiceClass。然后,它将使用客户端提供的对象在ServiceClass对象中调用所请求的函数。

使用wsdl2java生成的代码,每次调用该服务都会创建一个om.dummy.tst.service.TestSoapBindingImpl类型的对象,正如您所指出的那样,每个调用都会抛出异常。有两种方法可以提供有效的服务。

  1. 您可以使用您拥有的TestSoapBindingImpl.java文件作为起点。从每个函数中删除throws行,并在请求进入时使用您实际想要执行的代码填写每个函数体。

  2. 或者,您可以使用services.xml作为起点。将您自己的类定义为服务类。将对com.dummy.tst.service.TestSoapBindingImpl的引用替换为对您自己的服务类名称的引用。 wsdl2java可能生成了一个名为TestSoapBindingSkeleton.java的文件,它定义了服务类应该实现的接口。您的自定义服务类应实现此接口。

  3. 我一直在努力的项目使用方法#2。我们编写自己的服务类来实现骨架接口。将服务打包到AAR文件中时,请在AAR中包含services.xml文件。我们的打包规则在生成的services.xml上执行文本替换,以使用我们的服务类名称更新ServiceClass。