Thanks for your response. I'll narrow it down to the necessary.

SEI implementation:

@WebService(
        serviceName = "OA_Server",
        portName = "OA_ServerSoap",
        targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
        wsdlLocation = "classpath:OA_Server.wsdl",
        endpointInterface = "org.multispeak.version_4_1_6.
OA.OAServerSoap")
public class OAServerSoapImpl implements OAServerSoap {

...

@Override
    public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
        LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
        try {
            Preconditions.checkNotNull(multiSpeakMsgHeader);
            Preconditions.checkNotNull(multiSpeakMsgHeader1);
            MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);

mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
            return
LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
        } catch (Throwable t) {
            throw LOG.throwing(Throwables.unchecked(t));
        }
    }

@Override
@UseAsyncMethod
public ArrayOfErrorObject odEventNotification(
ArrayOfOutageDetectionEvent odEvents, String transactionID,
MultiSpeakMsgHeader multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
multiSpeakMsgHeader1) {
        LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
multiSpeakMsgHeader1);
        try {
            Preconditions.checkNotNull(odEvents, "odEvents");
            Preconditions.checkNotNull(transactionID, "transactionID");
            Preconditions.checkNotNull(multiSpeakMsgHeader,
"multiSpeakMsgHeader");
            Preconditions.checkNotNull(multiSpeakMsgHeader1,
"multiSpeakMsgHeader1");
            MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);

mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
            return
LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
transactionID, mspkHeader)));
        } catch (Throwable t) {
            throw LOG.throwing(Throwables.unchecked(t));
        }
    }

    @Override
    public Future<?> pingURLAsync(MultiSpeakMsgHeader multiSpeakMsgHeader,
Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
AsyncHandler<PingURLResponse> asyncHandler) {
        LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
        try {
            PingURLAsync response = new PingURLAsync(this,
multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
            mExecutor.submit(response);
            return LOG.exit(response.getServerAsyncResponse());
        } catch (Throwable t) {
            throw LOG.throwing(Throwables.unchecked(t));
        }
    }

@Override
    public Future<?> odEventNotificationAsync(ArrayOfOutageDetectionEvent
odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
AsyncHandler<ODEventNotificationResponse> asyncHandler) {
        LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
multiSpeakMsgHeader1);
        try {
            OdEventNotificationAsync response = new
OdEventNotificationAsync(this, odEvents, transactionID,
multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
            mExecutor.submit(response);
            return LOG.exit(response.getServerAsyncResponse());
        } catch (Throwable t) {
            throw LOG.throwing(Throwables.unchecked(t));
        }
    }

...

}

To make it clear, I'll add the code to the MultiSpeakInOutHeader class:

public final class MultiSpeakInOutHeader<T> {

    private final T mIn;
    private final Holder<T> mOut;

    private MultiSpeakInOutHeader(T in, Holder<T> out) {
        Preconditions.checkNotNull(in);
        Preconditions.checkNotNull(out);
        mIn = in;
        mOut = out;
    }

    public T getInbound() {
        return mIn;
    }

    public T getOutbound() {
        return getHolder().value;
    }

    public void setOutbound(T out) {
        getHolder().value = out;
    }

    private Holder<T> getHolder() {
        return mOut;
    }

    public static <T> MultiSpeakInOutHeader<T> of(T inbound, Holder<T>
outbound) {
        return new MultiSpeakInOutHeader<T>(inbound, outbound);
    }
}

When I invoke:

Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>();
Future<?> future = mServer.odEventNotificationAsync(new
ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(), headerOut,
new AsyncHandlerImpl(headerOut));

an NPE is thrown at HolderOutInterceptor If I use @UseAsyncMethod or
headerOut.value is null if I don't. Now, when I invoke:

Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>();
Future<?> future = mServer.pingURLAsync(new MultiSpeakMsgHeader(),
headerOut, new AsyncHandlerImpl(headerOut));

it works. The client can see the value field / no NPE is thrown.

Comparing my code to the sample, I believe I'm doing it correctly:

1. The client creates the Holder object and passes it down to the method
invocation
2. The server assigns the value field before returning

It's rather strange that one invocation works and the other does not. The
only difference between them is that pingURL has no arguments and
odEventNotification has one (ArrayOfOutageDetectionEvent). I have another
argumentless method that works just fine as well and another with arguments
that does not, so I think the problem lies in the number of arguments
somehow or how the Holder types are manipulated.

If the test that you linked me to works in the current release of CXF,
maybe I have something wrong with my configuration?
I will run that same test in my machine to see how it goes.

Thanks.

Regards,


André Costa Lima


2014-12-01 15:04 GMT+00:00 Aki Yoshida <[email protected]>:

> Your post is kind of too long and I am not really seeing how your
> client is calling the method and how your service is setting the
> value,
> Could you compare that to the cxf's sample code at
> samples/soap_header/src/main/java/demo/soap_header/(client|server)?
>
>
> 2014-11-28 18:21 GMT+01:00 André Costa Lima <[email protected]>:
> > Hello,
> >
> > I am a new CXF (v3.0.0) user. Actually, I am new to the whole JAX-WS
> thing.
> > :)
> > I have set up a JAX-WS service, SOAP over JMS with ActiveMQ. The server
> > methods invocations are working fine, but I am having some trouble
> > regarding the Holder class.
> > I am using the holder class as a container for the outgoing SOAP header
> for
> > all web methods, as specified in the WSDL.
> > I started from WSDL first with Spring configuration for both clients and
> > servers.
> > I have provided an async binding to the wsdl2java tool to generate the
> > async method signatures, because I want to use those instead of the sync
> > ones.
> >
> > The problem is that when I pass the Holder object to the client method
> and
> > assign the value field in the server, the client sees it as null but no
> > exception is thrown.
> > Further, if I put the @UseAsyncMethod annotation to command CXF to use
> the
> > pure async method I have implemented, CXF throws NPE at
> > HolderOutInterceptor class.
> > I noticed that if the web method has no arguments besides the SOAP
> headers
> > everything works just fine, otherwise what I have described above
> happens.
> >
> > Below there are my configurations.
> >
> > Maven plugin:
> >
> > <plugin>
> > <groupId>org.apache.cxf</groupId>
> >           <artifactId>cxf-codegen-plugin</artifactId>
> >           <executions>
> >           <execution>
> >                     <id>generate-sources</id>
> >                               <phase>generate-sources</phase>
> >                               <configuration>
> >                               <defaultOptions>
> >                                         <bindingFiles>
> >
> >
> <bindingFile>${basedir}/src/main/resources/oa_types-binding.xml</bindingFile>
> >
> >
> <bindingFile>${basedir}/src/main/resources/oa_async-binding.xml</bindingFile>
> >                                         </bindingFiles>
> >
> > <noAddressBinding>true</noAddressBinding>
> >                                     </defaultOptions>
> >                                     <sourceRoot>
> >
> > ${basedir}/target/generated-sources/cxf
> >                                     </sourceRoot>
> >                                     <wsdlOptions>
> >                                         <wsdlOption>
> >
> > <wsdl>${basedir}/src/main/resources/OA_Server.wsdl</wsdl>
> >
> > <wsdlLocation>classpath:OA_Server.wsdl</wsdlLocation>
> >                                             <extraargs>
> >                                                 <extraarg>-p</extraarg>
> >                                                 <extraarg>
> >
> http://www.multispeak.org/Version_4.1_Release=org.multispeak.version_4_1_6.OA
> > </extraarg>
> >                                                 <extraarg>-p</extraarg>
> >
> > <extraarg>cpsm_V4.1_Release=org.cspm.version_4_1.OA</extraarg>
> >                                                 <extraarg>-p</extraarg>
> >
> > <extraarg>gml_V4.1_Release=org.gml.version_4_1.OA</extraarg>
> >                                                 <extraarg>-p</extraarg>
> >                                                 <extraarg>
> > http://www.w3.org/1999/xlink=org.w3.xlink.OA</extraarg>
> >                                                 <extraarg>-p</extraarg>
> >                                                 <extraarg>
> > http://www.w3.org/2001/XMLSchema=org.w3.xmlschema.OA</extraarg>
> >                                                 <!--
> > <extraarg>-p</extraarg> -->
> >                                                 <!--
> > <extraarg>org.multispeak.version_4_1_6.OA</extraarg> -->
> >                                                 <!--
> > <extraarg>-impl</extraarg> -->
> >                                                 <!--
> > <extraarg>-server</extraarg> -->
> >                                                 <!--
> > <extraarg>-client</extraarg> -->
> >
> > <extraarg>-autoNameResolution</extraarg>
> >                                                 <extraarg>-fe</extraarg>
> >
>  <extraarg>jaxws21</extraarg>
> >
>  <extraarg>-exsh</extraarg>
> >                                                 <extraarg>true</extraarg>
> >                                             </extraargs>
> >                                         </wsdlOption>
> >                                     </wsdlOptions>
> >                                 </configuration>
> >                                 <goals>
> >                                     <goal>wsdl2java</goal>
> >                                 </goals>
> > </execution>
> > </executions>
> > </plugin>
> >
> > Spring:
> >
> >     <beans:bean id="connection-factory"
> > class="org.apache.activemq.ActiveMQConnectionFactory">
> >         <beans:property name="brokerURL"
> > value="${outside.multispeak.jms.broker}"/>
> >     </beans:bean>
> >
> >     <beans:bean id="pooled-connection-factory"
> > class="org.apache.activemq.pool.PooledConnectionFactory"
> > destroy-method="stop">
> >         <beans:constructor-arg index="0" ref="connection-factory"/>
> >         <beans:property name="expiryTimeout"
> > value="${outside.multispeak.jms.pool.expiryTimeout}"/>
> >     </beans:bean>
> >
> > <!-- multispeak call handling interface (OA) -->
> >
> >         <!-- client side -->
> >
> >         <jaxws:client
> >             id="multispeak-oa-client"
> >             xmlns:ns="http://www.multispeak.org/Version_4.1_Release";
> >             serviceClass="org.multispeak.version_4_1_6.OA.OAServerSoap"
> >             serviceName="ns:OA_Server"
> >             endpointName="ns:OA_ServerSoap"
> >             address="#{'jms:queue:'
> >                 + '${outside.multispeak.oa.jms.queue}'
> >                 + '?timeToLive=' + '${outside.multispeak.jms.timeToLive}'
> >                 + '&amp;requestTimeout' +
> > '${outside.multispeak.jms.receiveTimeout}'}"
> >             wsdlLocation="classpath:OA_Server.wsdl">
> >             <jaxws:features>
> >                 <beans:bean class="org.apache.cxf.feature.LoggingFeature
> "/>
> >                 <beans:bean
> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
> >                     <beans:constructor-arg index="0"
> > ref="pooled-connection-factory"/>
> >                 </beans:bean>
> >             </jaxws:features>
> >            </jaxws:client>
> >
> >         <!-- server side -->
> >
> >         <beans:bean id="forwarding-oa-server"
> > class="${outside.multispeak.oa.server}" />
> >         <beans:bean id="multispeak-oa-obj-factory"
> > class="org.multispeak.version_4_1_6.OA.ObjectFactory" />
> >
> >         <jaxws:endpoint
> >             id="multispeak-oa-server"
> >             xmlns:tns="http://www.multispeak.org/Version_4.1_Release";
> >
>  implementor="x.x.outside.multispeak.oa.server.OAServerSoapImpl"
> >             serviceName="tns:OA_Server"
> >             endpointName="tns:OA_ServerSoap"
> >             address="#{'jms:queue:' +
> '${outside.multispeak.oa.jms.queue}'
> > + ''}"
> >             publish="false"
> >             wsdlLocation="classpath:OA_Server.wsdl">
> >             <jaxws:features>
> >                 <beans:bean class="org.apache.cxf.feature.LoggingFeature
> "/>
> >                 <beans:bean
> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
> >                     <beans:constructor-arg index="0"
> > ref="pooled-connection-factory"/>
> >                 </beans:bean>
> >             </jaxws:features>
> >         </jaxws:endpoint>
> >
> > The Service Endpoint Interface generated.
> > There are two methods: pingURL and odEventNotification.
> > pingURLAsync, as it has no arguments besides the headers, works just
> fine,
> > but odEventNotificationAsync does not.
> > Note that I am using an AsyncHandler of course. In case of pingURLAsync I
> > can get Holder.value in the handleResponse(Response<T>) callback without
> > any problems.
> >
> > @WebService(targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release";,
> > name = "OA_ServerSoap")
> > @XmlSeeAlso({ObjectFactory.class, org.w3.xlink.OA.ObjectFactory.class,
> > org.gml.version_4_1.OA.ObjectFactory.class,
> > org.cspm.version_4_1.OA.ObjectFactory.class})
> > public interface OAServerSoap {
> >
> > ...
> >
> > @RequestWrapper(localName = "PingURL", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.PingURL")
> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >     @WebMethod(operationName = "PingURL")
> >     public Response<org.multispeak.version_4_1_6.OA.PingURLResponse>
> > pingURLAsync(
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
> >     );
> >
> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.PingURL")
> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >     @WebMethod(operationName = "PingURL")
> >     public Future<?> pingURLAsync(
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >         @WebParam(name = "asyncHandler", targetNamespace = "")
> >         AsyncHandler<org.multispeak.version_4_1_6.OA.PingURLResponse>
> > asyncHandler
> >     );
> >
> >     /**
> >      * Requester pings URL of OA to see if it is alive.  Returns
> > errorObject(s) as necessary to communicate application status.
> >      */
> >     @WebResult(name = "PingURLResult", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";)
> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.PingURL")
> >     @WebMethod(operationName = "PingURL", action = "
> > http://www.multispeak.org/Version_4.1_Release/PingURL";)
> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject pingURL(
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
> >     );
> >
> > @RequestWrapper(localName = "ODEventNotification", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> > className =
> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >     @WebMethod(operationName = "ODEventNotification")
> >     public
> > Response<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> > odEventNotificationAsync(
> >         @WebParam(name = "ODEvents", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";)
> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> > odEvents,
> >         @WebParam(name = "transactionID", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";)
> >         java.lang.String transactionID,
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
> >     );
> >
> >     @RequestWrapper(localName = "ODEventNotification", targetNamespace =
> "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> > className =
> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >     @WebMethod(operationName = "ODEventNotification")
> >     public Future<?> odEventNotificationAsync(
> >         @WebParam(name = "ODEvents", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";)
> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> > odEvents,
> >         @WebParam(name = "transactionID", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";)
> >         java.lang.String transactionID,
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >         @WebParam(name = "asyncHandler", targetNamespace = "")
> >
> > AsyncHandler<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> > asyncHandler
> >     );
> >
> >     /**
> >      * Publisher notifies OA of a change in OutageDetectionEvents by
> > sending an array of changed OutageDetectionEvent objects.  OA returns
> > information about failed transactions using an array of errorObjects. The
> > message header attribute 'registrationID' should be added to all publish
> > messages to indicate to the subscriber under which registrationID they
> > received this notification data.
> >      */
> >     @WebResult(name = "ODEventNotificationResult", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";)
> >     @RequestWrapper(localName = "ODEventNotification", targetNamespace =
> "
> > http://www.multispeak.org/Version_4.1_Release";, className =
> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >     @WebMethod(operationName = "ODEventNotification", action = "
> > http://www.multispeak.org/Version_4.1_Release/ODEventNotification";)
> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> > className =
> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
> > odEventNotification(
> >         @WebParam(name = "ODEvents", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";)
> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> > odEvents,
> >         @WebParam(name = "transactionID", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";)
> >         java.lang.String transactionID,
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release";, header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release";,
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
> >     );
> >
> > ...
> >
> > The SEI implementation.
> > Both pingURL and odEventNotification simply forward the call to a
> delegate.
> > Both inbound and outbound headers are placed in a common container and
> > handed over to the delegate.
> > The async methods simply execute the calls in background and end up
> calling
> > the sync methods internally.
> > The line
> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> > simply calls multiSpeakMsgHeader1.value = ...
> >
> > @WebService(
> >         serviceName = "OA_Server",
> >         portName = "OA_ServerSoap",
> >         targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >         wsdlLocation = "classpath:OA_Server.wsdl",
> >         endpointInterface =
> "org.multispeak.version_4_1_6.OA.OAServerSoap")
> > public class OAServerSoapImpl implements OAServerSoap {
> >
> > ...
> >
> > @Override
> >     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
> > multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >         try {
> >             Preconditions.checkNotNull(multiSpeakMsgHeader);
> >             Preconditions.checkNotNull(multiSpeakMsgHeader1);
> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >
> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >             return
> > LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
> >         } catch (Throwable t) {
> >             throw LOG.throwing(Throwables.unchecked(t));
> >         }
> >     }
> >
> > @Override
> > @UseAsyncMethod
> > public ArrayOfErrorObject odEventNotification(ArrayOfOutageDetectionEvent
> > odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> > multiSpeakMsgHeader1);
> >         try {
> >             Preconditions.checkNotNull(odEvents, "odEvents");
> >             Preconditions.checkNotNull(transactionID, "transactionID");
> >             Preconditions.checkNotNull(multiSpeakMsgHeader,
> > "multiSpeakMsgHeader");
> >             Preconditions.checkNotNull(multiSpeakMsgHeader1,
> > "multiSpeakMsgHeader1");
> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >
> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >             return
> >
> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
> > transactionID, mspkHeader)));
> >         } catch (Throwable t) {
> >             throw LOG.throwing(Throwables.unchecked(t));
> >         }
> >     }
> >
> >     @Override
> >     public Future<?> pingURLAsync(MultiSpeakMsgHeader
> multiSpeakMsgHeader,
> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> > AsyncHandler<PingURLResponse> asyncHandler) {
> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
> asyncHandler);
> >         try {
> >             PingURLAsync response = new PingURLAsync(this,
> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >             mExecutor.submit(response);
> >             return LOG.exit(response.getServerAsyncResponse());
> >         } catch (Throwable t) {
> >             throw LOG.throwing(Throwables.unchecked(t));
> >         }
> >     }
> >
> > @Override
> >     public Future<?> odEventNotificationAsync(ArrayOfOutageDetectionEvent
> > odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> > AsyncHandler<ODEventNotificationResponse> asyncHandler) {
> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> > multiSpeakMsgHeader1);
> >         try {
> >             OdEventNotificationAsync response = new
> > OdEventNotificationAsync(this, odEvents, transactionID,
> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >             mExecutor.submit(response);
> >             return LOG.exit(response.getServerAsyncResponse());
> >         } catch (Throwable t) {
> >             throw LOG.throwing(Throwables.unchecked(t));
> >         }
> >     }
> >
> > ...
> >
> > The invocation test.
> >
> > ...
> > Holder<MultiSpeakMsgHeader> headerOut = new
> Holder<MultiSpeakMsgHeader>();
> > Future<?> future = mServer.odEventNotificationAsync(new
> > ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(), headerOut,
> > new AsyncHandlerImpl(headerOut));
> > ...
> > private static class AsyncHandlerImpl implements
> > AsyncHandler<ODEventNotificationResponse> {
> >
> >         private static final XLogger LOG =
> > XLoggerFactory.getXLogger(AsyncHandlerImpl.class);
> >
> >         private final Holder<MultiSpeakMsgHeader> mHeaderOut;
> >
> >         public AsyncHandlerImpl(Holder<MultiSpeakMsgHeader> headerOut) {
> >             mHeaderOut = headerOut;
> >         }
> >
> >         @Override
> >         public void handleResponse(Response<ODEventNotificationResponse>
> > res) {
> >             try {
> >                 if (LOG.isTraceEnabled()) {
> >                     LOG.trace("Callback: {}", res.toString());
> >                 }
> >                 ODEventNotificationResponse mspkRsp = res.get();
> >                 if (LOG.isTraceEnabled()) {
> >                     LOG.trace("OA odEventNotificationAsync() >> callback:
> > {} > multispeak header: {}", mspkRsp.toString(), mHeaderOut.value);
> > //                    for (Entry<String, Object> entry :
> > res.getContext().entrySet()) {
> > //                        LOG.trace("Response context >> string > {} >>
> > object > {}", entry.getKey(), entry.getValue());
> > //                    }
> >                 }
> >             } catch (Exception e) {
> >                 LOG.catching(e);
> >             }
> >         }
> >     }
> >
> > As I said above, a NPE is thrown in HolderOutInterceptor when the
> response
> > is returned to the client if I use the pure async method with
> > @UseAsyncMethod,
> > or mHeaderOut.value is null if I don't. Now, the stacktrace:
> >
> > 28-11-2014 17:15:07.997 WARN  [OA Thread-#1]
> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for {
> >
> http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}ODEventNotification
> > has thrown exception, unwinding now
> > java.lang.NullPointerException
> >     at
> >
> org.apache.cxf.jaxws.interceptors.HolderOutInterceptor.handleMessage(HolderOutInterceptor.java:90)
> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:81)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.continuations.JMSContinuation.doResume(JMSContinuation.java:109)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.continuations.JMSContinuation.resume(JMSContinuation.java:98)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker$JaxwsServerHandler.handleResponse(AbstractJAXWSMethodInvoker.java:193)
> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at
> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireResult(AbstractAsyncResponseHandler.java:55)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireAsyncResult(AbstractAsyncResponseHandler.java:46)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.postProcess(AbstractAsyncResponseHandler.java:41)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable$1.invoke(ConditionEnforcerHandlerRunnable.java:10)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.util.ConditionEnforcerHandler$2.invoke(ConditionEnforcerHandler.java:25)
> > [classes/:?]
> >     at
> > x.x.outside.common.util.ExceptionHandler.handle(ExceptionHandler.java:7)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.util.ConditionEnforcerHandler.handle(ConditionEnforcerHandler.java:20)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable.run(ConditionEnforcerHandlerRunnable.java:7)
> > [classes/:?]
> >     at
> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> > [?:1.6.0_33]
> >     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> > [?:1.6.0_33]
> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> > [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> > [?:1.6.0_33]
> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> > 28-11-2014 17:15:08.044 TRACE [ActiveMQ Session Task-1]
> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> > handleResponse - Callback:
> org.apache.cxf.jaxws.JaxwsClientCallback$2@cc6f8c
> > 28-11-2014 17:15:08.044 ERROR [ActiveMQ Session Task-1]
> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> > handleResponse - catching
> > java.util.concurrent.ExecutionException:
> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while processing.
> >     at
> >
> org.apache.cxf.jaxws.JaxwsClientCallback$2.get(JaxwsClientCallback.java:99)
> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at
> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl.handleResponse(OAServerTestAsyncCallback.java:81)
> > [classes/:?]
> >     at
> >
> org.apache.cxf.jaxws.JaxwsClientCallback.handleException(JaxwsClientCallback.java:87)
> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:821)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> > [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> > [?:1.6.0_33]
> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> > processing.
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     ... 11 more
> > 28-11-2014 17:15:08.045 ERROR
> > [x.x.outside.test.multispeak.OAServerTestAsyncCallback-1]
> > x.x.outside.test.multispeak.OAServerTestAsyncCallback run - catching
> > java.util.concurrent.ExecutionException:
> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while processing.
> >     at
> org.apache.cxf.endpoint.ClientCallback.get(ClientCallback.java:169)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.jaxws.JaxwsResponseCallback.get(JaxwsResponseCallback.java:54)
> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at
> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$1.run(OAServerTestAsyncCallback.java:52)
> > [classes/:?]
> >     at
> >
> x.x.outside.test.multispeak.spi.AbstractMultispeakServerTest$2.run(AbstractMultispeakServerTest.java:112)
> > [classes/:?]
> >     at
> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> > [?:1.6.0_33]
> >     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> > [?:1.6.0_33]
> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> > [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> > [?:1.6.0_33]
> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> > processing.
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     ... 3 more
> >
> > Is this a configuration problem? Am I doing something stupid?
> > Thanks!
> >
> > Regards,
> >
> > André Costa Lima
>

Reply via email to