在Groovy中具有complexTypes的Axis2

时间:2012-10-09 08:27:36

标签: web-services ant groovy axis2 groovyws

所以我有几个ANT脚本使用Groovy来处理正常ANT无法做到的复杂计算(至少是afaik)。我正在尝试通过Groovy使用SOAP信封访问Axis2 Web服务。请求和响应非常简单,除了两个complexType属性(请求中的一个,响应中的一个)。

我偶然发现的第一件事是 Groovy Soap 。它非常易于使用,您只需实例化SoapClient并调用Web服务方法即可。不幸的是,它无法处理请求中的complexType属性,我需要:

  

目前的限制:

     

...

     

4:在使用当前groovy-1.0版本的Groovy SOAP模块时,无法在客户端处理自定义数据类型。

然后我读了很多关于 GroovyWS 的内容。我在我的user.home创建了我的Grape配置文件,javac和$ GROOVY_HOME可用(基本上按照project quick guide page所述完成了所有操作)。 Grape以某种方式检索了Ivy,当我第一次启动脚本时(我没有使用Grape的经验,但我怀疑它与Maven非常相似)。

然后开始我的简单脚本:

@Grab(group='org.codehaus.groovy.modules', module='groovyws',version='0.5.2')
import groovyx.net.ws.WSClient
proxy = new WSClient("http://127.0.0.1/axis2/services/ReleaseService?wsdl", this.class.classLoader)
proxy.initialize()

不幸的是我甚至无法初始化Web客户端(没有类路径中的Groovy Soap库):

SEVERE: Could not compile java files for http://127.0.0.1/axis2/services/ReleaseService?wsdl.
Caught: java.lang.IllegalStateException: Unable to create JAXBContext for generated packages: Provider com.sun.xml.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "com.intershop.qa.tae.ws.xsd" doesnt contain ObjectFactory.class or jaxb.index java.lang.IllegalStateException: Unable to create JAXBContext for generated packages: Provider com.sun.xml.bind.v2.ContextFactory could not be instantiated [...]

在类路径中使用Groovy Soap库(似乎会使GroovyWS的某些功能过载):

Caught: java.lang.NoSuchMethodError: javax.wsdl.xml.WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator;Lorg/w3c/dom/Element;)Ljavax/wsdl/Definition; java.lang.NoSuchMethodError:

看起来非常类似于我在第一时间使用Groovy Soap时遇到的错误。

所以我的问题是: 如何通过ANT使用complexType参数与Axis2 Web服务进行通信。我不仅限于Groovy,但出于部署原因(约50个VM快照),我想要一些简单的东西。 Java客户端工作,但由于部署是相当费力的(特别是如果我想在将来更改内容),我需要一些更接近ANT并且更易于部署的东西。

提前感谢您提供其他技术的建议或为我的GroovyWS实施提供解决方案。

2 个答案:

答案 0 :(得分:0)

我终于想出了一个解决方案: groovy-wslight 实际上解决了我的问题,最终能够轻松部署并访问Web服务而不会出现任何问题/异常。

剧本:

@Grab(group='com.github.groovy-wslite', module='groovy-wslite', version='0.7.1')
import wslite.soap.*
def client = new SOAPClient("http://127.0.0.1/axis2/services/ReleaseService")
def response = client.send  {
  body {
    myFunction(xmlns:"http://my.namespace.com") {
       stringParameter("6.3.0.0")
       status() { value("default") }
       mode() { value("full") }
    }
  }
}

其中statusmodecomplexTypes,其中包含一个“值”属性(作为示例)。

println(response.myFunctionResponse.return)

给我Web服务返回的对象。当然,令牌的名称取决于WSDL。在我的情况下,请求的响应称为myFunctionResponse,它有一个字段name="return",并给我一个complexType对象。可以根据WSDL中给出的名称检索对象的字段:

println(response.myFunctionResponse.return.location) // gives me the field value of the field "location" for my complexType

答案 1 :(得分:0)

使用JDK 1.7时遇到了类似的问题。切换到JDK 1.6解决了它。