首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Groovy中使用Axis2和complexTypes

在Groovy中使用Axis2和complexTypes
EN

Stack Overflow用户
提问于 2012-10-09 08:27:35
回答 2查看 1.1K关注 0票数 0

因此,我有几个ANT脚本使用Groovy来处理复杂的计算,普通的ANT无法完成(至少afaik)。我试图通过Groovy使用SOAP信封访问Axis2 web服务。请求和响应非常简单,除了两个complexType属性(一个在请求中,一个在响应中)。

我遇到的第一件事是Groovy Soap。它非常容易使用,您只需实例化一个SoapClient并调用web服务方法。不幸的是,它无法处理请求中的complexType属性,我需要:

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

然后我读了很多关于GroovyWS的文章。我在user.home中创建了Grape文件,javac和$GROOVY_HOME是可用的(基本上按照项目快速指南页面上的描述做了所有事情)。葡萄以某种方式恢复了常春藤,当我第一次开始脚本(我对葡萄没有经验,但我怀疑它非常类似于Maven)。

然后启动我的简单脚本:

代码语言:javascript
复制
@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库):

代码语言:javascript
复制
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 [...]

在类路径中使用GroovyWS库(它似乎重载了一些GroovyWS的功能):

代码语言:javascript
复制
Caught: java.lang.NoSuchMethodError: javax.wsdl.xml.WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator;Lorg/w3c/dom/Element;)Ljavax/wsdl/Definition; java.lang.NoSuchMethodError:

这与我最初使用Groovy时遇到的错误非常相似。

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

预先感谢您为我的GroovyWS实现提供的其他技术建议或修复想法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-09 14:20:56

我终于想出了一个解决方案:groovy实际上解决了我的问题,最终能够轻松地部署和访问web服务,没有问题/异常。

剧本:

代码语言:javascript
复制
@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") }
    }
  }
}

其中statusmode是由一个"value“属性组成的complexTypes (例如)。

代码语言:javascript
复制
println(response.myFunctionResponse.return)

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

代码语言:javascript
复制
println(response.myFunctionResponse.return.location) // gives me the field value of the field "location" for my complexType
票数 0
EN

Stack Overflow用户

发布于 2012-11-06 11:42:33

在使用JDK1.7时,我也遇到了类似的问题。切换到JDK1.6为我解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12795847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档