Quantcast
Channel: Metro and JAXB Related Items on Java.net
Viewing all articles
Browse latest Browse all 171

SOAP, WebParam.Mode.OUT always returns null (solved)

$
0
0

Hi

I have a question to a JAX-WS project using JDK 1.6.0_45

I've generated a webservice from a WSDL looking like this:

...
        <wsdl:operation name="getTransactionList">
            <soap:operation style="document" soapAction="getTransactionList"/>
            <wsdl:input>
                <soap:body use="literal" parts="body"/>
                <soap:header use="literal" message="tns:getTransactionListRequest" part="header"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" parts="body"/>
                <soap:header use="literal" message="tns:getTransactionListResponse" part="header"/>
            </wsdl:output>
            <wsdl:fault name="fault1">
                <soap:fault use="literal" name="fault1"/>
            </wsdl:fault>
        </wsdl:operation>
...
    <wsdl:message name="getTransactionListResponse">
        <wsdl:part name="header" element="ns0:responseHeader"/>
        <wsdl:part name="body" element="ns0:getTransactionListResponse"/>
    </wsdl:message>
...

As you can see, getTransactionList returns a message with 2 components, header and body. Using wsimport this ends up like this:

    @WebMethod(action = "getTransactionList")
    public void getTransactionList(
        @WebParam(name = "requestHeader", targetNamespace = "http://namespace/IAS/WebService/Schema", header = true, partName = "header")
        RequestHeaderType header,
        @WebParam(name = "getTransactionListRequest", targetNamespace = "http://namespace/IAS/WebService/Schema", partName = "body")
        GetTransactionListRequestType body,
        @WebParam(name = "responseHeader", targetNamespace = "http://namespace/IAS/WebService/Schema", header = true, mode = WebParam.Mode.OUT, partName = "header")
        Holder<ResponseHeaderType> header0,
        @WebParam(name = "getTransactionListResponse", targetNamespace = "http://namespace/IAS/WebService/Schema", mode = WebParam.Mode.OUT, partName = "body")
        Holder<GetTransactionListResponseType> body0)
        throws ErrorInfo
    ;

The two return values are annoted as WebParam.Mode.OUT.

Now i've written a short test method

  public static void main(final String[] args) throws Exception {
    try {
      IASService _s = new IASService(new URL("http://127.0.0.1/WodisScratch/IAServiceEndpoint?wsdl"), new QName(
          "http://namespace/IAS/WebService/WDSL/concrete", "IAS_Service"));
      RequestHeaderType header = new RequestHeaderType();
      GetTransactionListRequestType body = new GetTransactionListRequestType();
      Holder<ResponseHeaderType> header0 = new Holder<ResponseHeaderType>(new ResponseHeaderType());
      Holder<GetTransactionListResponseType> body0 = new Holder<GetTransactionListResponseType>(new GetTransactionListResponseType());
      System.out.println("Call");
      System.out.println("body0: " + body0);
      System.out.println("body0.value: " + body0.value);

      System.out.println("*BOOM*");
      _s.getIAServiceEndpoint().getTransactionList(header, body, header0, body0);
      System.out.println("Never seeing this");

      for (Transaction _t : body0.value.getTransaction()) {
        System.out.println(_t.getTransactionId());
      }
    } catch (ErrorInfo e) {
      e.printStackTrace();
    }
  }

Output:

Call
body0: javax.xml.ws.Holder@12d263f
body0.value: namespace.ias.webservice.schema.GetTransactionListResponseType@12a0f6c
*BOOM*

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: java.lang.NullPointerException
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:119)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at com.sun.proxy.$Proxy33.getTransactionList(Unknown Source)
at de.kalo.Test.main(Test.java:31)
Caused by: java.lang.NullPointerException
at namespace.ias.webservice.wdsl.concrete.IAServiceEndpointImpl.getTransactionList(IAServiceEndpointImpl.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:246)
at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146)
at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)
at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:93)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436)
at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:243)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:444)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:135)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:129)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:160)
at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:662)

The implementation looks like this:

  public void getTransactionList(final RequestHeaderType header, final GetTransactionListRequestType body, final Holder<ResponseHeaderType> header0,
      final Holder<GetTransactionListResponseType> body0) throws ErrorInfo {
    System.out.println("Start");
    System.out.println("body0: " + body0);
    System.out.println("body0.value: " + body0.value);
   ...

Output:
Start
body0: javax.xml.ws.Holder@1af8502
body0.value: null

Somewhere between API call and implementation the Holder-value ist lost, and replaced by another one with a null-value.

After half a day of googling and trying this and tthat i'm left clueless.

Have you any ideas?

Bye
Holger


Viewing all articles
Browse latest Browse all 171

Trending Articles