views:

648

answers:

3

I'm trying to deploy an application to Google App Engine that will eventually interface with JIRA and other services over SOAP. The J2SE 6 java.xml.soap.* APIs are not supported by the GAE JRE. What other simple libraries are available for building requests and parsing results over a URLConnection?

Axis and CXF seem to be the generally accepted SOAP/Web Services engines, but they seem somewhat overkill for my needs. Any recommendations?

A: 

I don't think Axis/cxf are overkill for you. They are fairly simple to use, solve the problem and are a standardized solution to solve your problem.

If you can explain why you do think they are so much more than you need, I'll be glad to reconsider

Rodrigo Gama
A: 

Hi All,

I needed to do a SOAP web service call from Google App Engine. I deployed axis.jar to perform the call from App Engine, but no luck there since I'm getting this error:

javax.servlet.ServletContext log: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String com.erpguru.integrator.client.ContactService.getContactFullNameByEmail(java.lang.String) throws java.lang.IllegalArgumentException' threw an unexpected exception: java.lang.NoClassDefFoundError: javax/xml/soap/SOAPException
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:378)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:581)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:190)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:226)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135)
    at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:250)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5838)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5836)
    at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
    at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:398)
    at com.google.net.rpc.impl.Server$2.run(Server.java:852)
    at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)
    at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:576)
    at com.google.net.rpc.impl.Server.startRpc(Server.java:807)
    at com.google.net.rpc.impl.Server.processRequest(Server.java:369)
    at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:442)
    at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319)
    at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290)
    at com.google.net.async.Connection.handleReadEvent(Connection.java:474)
    at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:831)
    at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207)
    at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:103)
    at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251)
    at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:413)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: javax/xml/soap/SOAPException
    at com.google.appengine.runtime.Request.process-8bf8389360512e0e(Request.java)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.getMethod0(Unknown Source)
    at java.lang.Class.getMethod(Class.java:215)
    at org.apache.axis.message.RPCParam.<clinit>(RPCParam.java:65)
    at org.apache.axis.client.Call.getParamList(Call.java:2087)
    at org.apache.axis.client.Call.invoke(Call.java:2364)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at com.netsuite.webservices.platform_2010_1.NetSuiteBindingStub.search(NetSuiteBindingStub.java:9990)
    at com.erpguru.integrator.server.NetSuiteClient.getContactByEmailAdvancedRLA(NetSuiteClient.java:126)
    at com.erpguru.integrator.server.NetSuiteClient.getContactFullNameByEmail(NetSuiteClient.java:42)
    at com.erpguru.integrator.server.ContactServiceImpl.getContactFullNameByEmail(ContactServiceImpl.java:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Method.java:43)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:562)
    ... 46 more
Caused by: java.lang.ClassNotFoundException: javax.xml.soap.SOAPException
    ... 60 more

I don't even directly use the SOAPException, but it looks to be used at runtime. Deploying saaj.jar did not help neither. When I explicitely use a SOAPException in my code, the compiler says:

javax.xml.soap.SOAPException is not supported by Google App Engines's Java runtime environment

Anybody succeeded in making a SOAP web service call??

Thanks, Daniel

dangig
No current SAAJ support on GAE. Maybe someday. :-/
Chris Kaminski
This site is a little bit different from forum sites - it's organized into questions and answers. If you have a different question to ask, even if it's related, please consider starting a new question instead.
Anonymouse
A: 

OK, votes are open to whitelist the javax.xml.soap.* classes, but since more than one year!

It's strange though, how it has been easy to call the same SOAP web service using Google Apps Script from a Google Spreadsheet, and it is not even a possibility on GAE.

Daniel

dangig
Completely different beasts - Google gets to keep control of the libraries making web services calls on Google Docs. They don't have that luxury on GAE. That said, parsing XML falls into that domain of high-cpu/high-memory that they want to avoid (rightly or wrongly). I just don't want to roll my own SAX-based SOAP/WSDL parser. :-/
Chris Kaminski