Axis2 with complexTypes in Groovy
Asked Answered
G

2

0

So I'm having a couple of ANT scripts using Groovy to process complex calculations normal ANT can't do (at least afaik). I'm trying to access an Axis2 web service using a SOAP-envelope via Groovy. The request and response is pretty simple, except for two complexType attributes (one in the request, one in the response).

The first thing I've stumbled across was Groovy Soap. It is quite easy to use, you simply instantiate a SoapClient and call the web service method. Unfortunately it cannot handle complexType attributes in the request, which I need:

Current Limitations:

....

4: Custom data types cannot be processed on client side when using the Groovy SOAP module with the current groovy-1.0 release.

Then I've read a lot about GroovyWS. I created my Grape config file in my user.home, javac and $GROOVY_HOME are available (basically did everything as described on the project quick guide page). Grape somehow retrieved Ivy, when I first started the script (I have no experience with Grape, but I suspect it's very similar to Maven).

Then started my simple script:

@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()

Unfortunately I couldn't even initialize the web client (without the Groovy Soap library in the classpath):

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 [...]

With the Groovy Soap library (which seems to overload some of GroovyWS' functionality) in the classpath I've got:

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

which looks very similar to the error I've got when I was using Groovy Soap in the first place.

So my question is: How can I communicate with an Axis2 web service using complexType parameters via ANT. I'm not limited to Groovy only, but for deployment reasons (~50 VM snapshots) I want something simple. A Java client worked, but since the deployment is quite some effort (especially if I want to change stuff in the future) I need something which is closer to ANT and easier to deploy.

Thanks in advance for suggestions of other technologies or fix ideas for my GroovyWS implementation.

Grijalva answered 9/10, 2012 at 8:27 Comment(3)
Please report when you finally make it. I can't help you except pointing to another so question: How to call a web service from Ant script or from within Jenkins?. If you come up with something better, you could also answer that question.Unsuccess
So what was the problem? Why GroovyWS did not work from the start?Unsuccess
Tbh I don't really know. It wasn't even able to initialize properly. Maybe some problems with Grape. And as mentioned I believe that it used Groovy Soap the time I had the library still included.Grijalva
G
0

I finally came up with a solution: groovy-wslight actually solved my problem and was finally able to deploy easily and access the web service without problems/exceptions.

The script:

@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") }
    }
  }
}

Where status and mode are complexTypes which consist of one "value" attribute (as an example).

println(response.myFunctionResponse.return)

gives me the object returned by the web service. Of course the names of the tokens depend on the WSDL. In my case the response of the request is called myFunctionResponse, which has a field name="return" and gives me a complexType object. The fields of the object can be retrieved according to the names given in the WSDL:

println(response.myFunctionResponse.return.location) // gives me the field value of the field "location" for my complexType
Grijalva answered 9/10, 2012 at 14:20 Comment(0)
F
0

I had a similar problem when using JDK 1.7. Switching to JDK 1.6 solved it for me.

Farika answered 6/11, 2012 at 11:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.