Ok, I've been reading through the source code of CXF and found that the error seems to be related with the service mode and the SAAJ interceptor. This may be a bug, so if someone more knowledgable could help out in isolating, please read on (note that the references to CXF sources are from the 2.2.4 release):

When the endpoint uses "message" mode:

   @WebServiceProvider(...)
>    @ServiceMode(Mode.MESSAGE)
   @BindingType(value = HTTPBinding.HTTP_BINDING)
   public class MyServiceProvider implements Provider<Source> {
   ...

Then the "org.apache.cxf.jaxws.interceptors.MessageModeOutInterceptor" will behave as follows (LINE 81):

       if (saajOut != null) {
           doSoap(message);

Where (LINE 147):

   private void doSoap(Message message) {
MessageContentsList list = (MessageContentsList)message.getContent(List.class);
       Object o = list.get(0);

The NPE is because "message.getContent(List.class);" returns null in this case.

I believe doSoap() should be re-written as:

   private void doSoap(Message message) {
MessageContentsList list = (MessageContentsList)message.getContent(List.class);
if(list != null) { // =========== do nothing if there is no content
       Object o = list.get(0);
       if (o instanceof SOAPMessage) {
           SOAPMessage soapMessage = (SOAPMessage)o;
           if (soapMessage.countAttachments() > 0) {
               message.put("write.attachments", Boolean.TRUE);
           }
       }
       message.getInterceptorChain().add(internal);
} // =========== end of addition
   }

Does this sound right?

Alexandros Karypidis wrote:
Hi,

I need some help with WS-Policy in CXF 2.2.4

I have been fighting to enable WS-Addressing using the WS-Addressing Metadata policy assertions. I attahed a policy in my WSDL with: <wsp:Policy wsu:Id='myPolicy' xmlns:wsp='http://www.w3.org/ns/ws-policy'> <wsam:Addressing xmlns:wsam='http://www.w3.org/2007/05/addressing/metadata' >
           <wsp:Policy/>
       </wsam:Addressing>
   </wsp:Policy>

Now, I have two separate CXF applications (the provider-app and the client-app). Both activate the policy framework by:
   1) Adding a dependency in their pom.xml to "cxf-rt-ws-policy"
   2) Including in their spring "beans.xml" an
<import resource="classpath:META-INF/cxf/cxf-extension-policy.xml" />

The problem is that when the provider has WS-Policy enabled, the MAPAggregator throws an NPE.

So, if I do (1) and (2) for both the "client WAR" and the "provider WAR", I get an NPE at the provider-side, while the incoming request is being processed. If I remove (1) and (2), the policy still gets parsed properly and Addressing headers are added by CXF in the client, without the provider complaining. I assume that in this case the addressing interceptors are not added to the endpoint of the provider, so it doesn't attempt to process the WS-Addressing headers, thus avoiding the NPE.

The NullPointerException is thrown while the server processes the request at:
java.lang.NullPointerException
at org.apache.cxf.jaxws.interceptors.MessageModeOutInterceptor.doSoap(MessageModeOutInterceptor.java:149) at org.apache.cxf.jaxws.interceptors.MessageModeOutInterceptor.handleMessage(MessageModeOutInterceptor.java:82) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236) at org.apache.cxf.ws.addressing.ContextUtils.rebaseResponse(ContextUtils.java:380) at org.apache.cxf.ws.addressing.MAPAggregator.mediate(MAPAggregator.java:355)
...
I looked at the CXF code and the catch() block which prints out the above stack trace also logs:
WARNING: SERVER_TRANSPORT_REBASE_FAILURE_MSG

I'm using CXF 2.2.4 / Sun JDK 1.6.0_16 and get the same error when deploying the "provider-app" on:

- Tomcat 6.0.20
- JBoss 5.1
- WebLogic 10.3.2

Any ideas what could be wrong?

Reply via email to