我在soap中使用cxf + WSClient时遇到了一些问题。grails/groovy中的WSClient soap客户端
我在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(字符串类名)是吃一个ClassNotFoundException(然后抛出一个NullPointerException)
Basicly当我提出以下调用
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?我真的想避免不得不滚动自己的.....