我在soap中使用cxf + WSClient时出现了一些问题。
我正在使用grails编写一个小工具,必须对现有服务进行SOAP调用。
WSClient(groovyws-0.5.3-20100521.062225-1.jar)似乎是我问题的完美解决方案。 但是当我试图实现对其中一个动作的调用时,我遇到了两个问题。
问题#1调用某些操作时出现NullPointerException。
我已经跟踪了在
中抛出异常的代码AbstractCXFWSClient.invokeMethod(String methodName, Object args)
if (!operationToBeInvoked.isUnwrapped()){
//Operation uses document literal wrapped style.
inputMessageInfo = operationToBeInvoked.getWrappedOperation().getInput();
} else {
inputMessageInfo = operationToBeInvoked.getUnwrappedOperation().getInput();
}
具体operationToBeInvoked.getWrappedOperation()
我已经在单元测试中隔离了代码,发现operationToBeInvoked.getWrappedOperation()
和operationToBeInvoked.getWrappedOperation()
都会产生空对象。我试图找出导致它的原因,但我想我已经知道了。
问题#2 WSClient.create(String classname)正在吃ClassNotFoundException(然后抛出NullPointerException)
基本上我进行以下调用
def event = client.create("com.mypackage.MyBean");
通过浏览器浏览服务我可以看到相同的bean。
<xs:complexType name="myBean">
<xs:sequence>
<xs:element minOccurs="0" name="id" type="xs:long"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="facets" nillable="true" type="tns:beanBean"/>
<xs:element minOccurs="0" name="sortId" type="xs:string"/>
<xs:element minOccurs="0" name="itemId" type="xs:string"/>
<xs:element minOccurs="0" name="preview" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
我得到了NPE。当我深入了解为什么我得到一个NPE时,我发现它是因为WSClient上的类加载器找不到“com.mypackage.MyBean”吃掉ClassNotFoundException然后不可避免地抛出一个NPE。
编辑:我应该使用WSClient / cxf的其他客户端吗?我真的想避免不得不自己动手.....
答案 0 :(得分:2)
基本上我找不到答案。我基本上被迫卸载了两个插件和cxf而没有使用groovy WSClient。
我所做的是为grails安装ws-client插件并且有效。
答案 1 :(得分:0)
尝试删除项目中.grails lib cxf插件文件夹中的jaxen jar。它应该可以解决你的问题。