【问题标题】:Axis2 with complexTypes in GroovyGroovy 中带有 complexTypes 的 Axis2
【发布时间】:2012-10-09 08:27:35
【问题描述】:

所以我有几个使用 Groovy 的 ANT 脚本来处理普通 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 实施的想法。

【问题讨论】:

  • 当你最终成功时请报告。除了指出另一个问题之外,我无能为力:How to call a web service from Ant script or from within Jenkins?。如果你想出更好的东西,你也可以回答这个问题。
  • 那么问题出在哪里?为什么 GroovyWS 从一开始就不起作用?
  • Tbh 我真的不知道。它甚至无法正确初始化。也许葡萄有一些问题。如前所述,我相信在我还包含库的时候它使用了 Groovy Soap。

标签: web-services ant groovy axis2 groovyws


【解决方案1】:

我终于想出了一个解决方案:groovy-wslight 确实解决了我的问题,终于能够轻松部署并访问网络服务而没有问题/异常。

脚本:

@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

【讨论】:

    【解决方案2】:

    我在使用 JDK 1.7 时遇到了类似的问题。切换到 JDK 1.6 为我解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多