2011-06-22 49 views
0

我在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?我真的想避免不得不滚动自己的.....

回答

2

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

我所做的是为grails安装ws-client插件,并且工作正常。

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

0

尝试删除Jaxen的的罐子在.grails LIB CXF项目中的插件文件夹。它应该解决你的问题。