JaxWsDynamicClientFactory.newInstance()。createClient()和wsdl2Java不一致

时间:2011-04-06 17:15:06

标签: web-services cxf wsdl2java

所以我试图使用JaxWsDynamicClientFactory动态创建SEI类。运行以下代码

JaxWsDynamicClientFactory def = JaxWsDynamicClientFactory.newInstance();
def.createClient("http://localhost:8080/TheTestService/TestService?wsdl");

生成类:

com.mycompany.project.service.GetProducts

com.mycompany.project.service.GetStatus

运行:

wsdl2Java -d "C/:outputdir" "http://localhost:8080/TheTestService/TestService?wsdl" 

生成类

com.mycompany.project.service.ServiceInterface

com.mycompany.project.service.GetProducts

com.mycompany.project.service.GetStatus

com.mycompany.project.service.impl.ServiceInterface

此外,当我试着打电话

client.invoke("getProducts", 0); 

我明白了:

org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name {http://impl.service.project.mycompany.com/}getProducts.

我觉得有意义,因为在impl.service.project.mycompany.com上没有生成任何名为getProducts的内容。但是,自从我编写Web服务以来,我知道Web服务接口的方法是getProducts(int id)。

我在这里做错了什么?根据CXF文档,动态客户端工厂使用与wsdl2Java工具相同的代码生成器。如果是这样的话,为什么不生成相同的类?

谢谢,

2 个答案:

答案 0 :(得分:2)

首先,JaxWsProxyFactoryBean创建客户端是可以的。我解决了这个问题,你必须将你的服务接口和implementor放在同一个类包中。当JaxWsDynamicClientFactory用于动态创建SEI类时,它会在同一个包路径中找到implementor,这是默认设置。但根据API,您可以设置targetNamespace

我不知道JaxWsProxyFactoryBeanJaxWsDynamicClientFactory之间存在差异。

答案 1 :(得分:0)

我认为这是一些错误,因为我有.wsdl和wsdl2java生成的一个类具有属性getItem但是JaxWsDynamicClientFactory.newInstance().createClient()已经使用属性getItems生成了这个类。所以我的进步是检查你想要使用的类的方法(我的意思是,使用JaxWsDynamicClientFactory.newInstance().createClient()生成的类的方法)。要实现这个使用参考