grails / groovy中的WSClient soap客户端

时间:2011-06-22 12:36:54

标签: grails soap groovy cxf

我在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的其他客户端吗?我真的想避免不得不自己动手.....

2 个答案:

答案 0 :(得分:2)

基本上我找不到答案。我基本上被迫卸载了两个插件和cxf而没有使用groovy WSClient。

我所做的是为grails安装ws-client插件并且有效。

http://www.grails.org/plugin/ws-client

答案 1 :(得分:0)

尝试删除项目中.grails lib cxf插件文件夹中的jaxen jar。它应该可以解决你的问题。