On Thu, Aug 30, 2018 at 2:46 PM Alex Borschenko <aaborsche...@gmail.com> wrote:
> Hi All! > I have deployed archive of services which consume/produce XMLs and now I'm > trying to add one more service who will consume/produce JSON. > It is simple service which operates with POJOs. > > To enable JSON operations I added to axis2.xml: > > <messageFormatter contentType="application/json" > class="org.apache.axis2.json.gson.JsonFormatter" > /> > > <messageBuilder contentType="application/json" > class="org.apache.axis2.json.gson.JsonBuilder" /> > > In services XML I have declared my service: > > <service name="LoginWSManager"> > <Description> > This is a sample service to test json implementation > </Description> > <messageReceivers> > <messageReceiver mep="http://www.w3.org/ns/wsdl/in-out" > <http://www.w3.org/ns/wsdl/in-out> > class="org.apache.axis2.json.gson.rpc.JsonRpcMessageReceiver" /> > <messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" > <http://www.w3.org/ns/wsdl/in-only> > > class="org.apache.axis2.json.gson.rpc.JsonInOnlyRPCMessageReceiver"/> > </messageReceivers> > <parameter name="ServiceClass" > locked="false">security.LoginWSManager</parameter> > </service> > > Service code: > > public LoginResponseWSBean login(String email, String password) throws > Exception { > Application.logger().info("Logging in user email: " + email); > > final LoginResponseWSBean loginResponseWSBean = new LoginResponseWSBean(); > try { > loginBusinessLogic.login(email, password); > } catch (Exception e) { > loginResponseWSBean.setLoggedIn(false); > loginResponseWSBean.setMessage(e.getMessage()); > loginResponseWSBean.setStackTrace(ExceptionUtils.getStackTrace(e)); > Application.logger().warning(String.format("Returning: %s", > loginResponseWSBean)); > return loginResponseWSBean; > } > loginResponseWSBean.setLoggedIn(true); > loginResponseWSBean.setMessage(email + " logged in successfully!"); > > return loginResponseWSBean; > } > public class LoginResponseWSBean implements Serializable { > > private boolean loggedIn = false; > private String message = ""; > private String stackTrace = ""; > > public LoginResponseWSBean(boolean loggedIn, String message, String > stackTrace) { > this.loggedIn = loggedIn; > this.message = message; > this.stackTrace = stackTrace; > } > > public LoginResponseWSBean() { > > } > .... > } > > > When I call it by this command: > > curl -X POST -H "Content-Type: application/json" -d > "{'login':[{'email':'em...@domain.com'}, > {'password':'secret'}]}" > <%7B%27login%27:[%7B%27email%27:%27em...@domain.com%27%7D,%7B%27password%27:%27secret%27%7D]%7D> > http://localhost:8080/axis2/services/LoginWSManager/login > > It responds with this message: > > {"Fault":{"faultcode":"soapenv:Server","faultstring":"java.lang.NullPointerException","detail":""}} > > In tomcat logs I can see this stacktrace: > > 30-Aug-2018 23:38:09.137 INFO [http-nio-8080-exec-9] > org.apache.catalina.core.StandardWrapperValve.invoke [ERROR] > java.lang.NullPointerException > at > org.apache.axis2.context.MessageContext.isFault(MessageContext.java:4304) > at > org.apache.axis2.transport.http.CommonsHTTPTransportSender.sendUsingOutputStream(CommonsHTTPTransportSender.java:289) > at > org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:244) > at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:431) > at > org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:43) > at > org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:106) > at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:169) > at > org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:178) > at > org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:163) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) > at > org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) > at > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) > at > org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) > at > org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100) > at > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687) > at > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) > at > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > at java.lang.Thread.run(Thread.java:745) > > Please help me find out why it is not processing LoginResponseWSBean response > object as expected and generates NPE. > Thanx! > > Alex > I am planning on a patch for this issue as I am using GSON / Axis2 quite a bit in my day job right now. There are a few things I want to discuss with the Axis2 dev team here, including this NPE. In this case I made this change in the MessageContext.java source. You would have to compile from source to fix it in the short term. I don't know why the Envelope is null here. Making this change had no effect on my existing soap based services but it did fix the GSON services. public boolean isFault() { if (getEnvelope() == null) { log.warn(getLogIDString() + ": ****WARNING**** " + myClassName + " , found null envelope, returning false"); return false; } return getEnvelope().hasFault(); } I was wondering if anyone is using GSON with axis2, the docs are something I plan on improving soon and good to know someone else is using this code. Regards, Robert