That's definitely a potential way of working around the issue, but I'm 
slightly concerned as to why the message would have no content.  Is there any 
way to create a small sample app (maybe take the provider example and add your 
policies and such) that would show this?    The list really shouldn't be null 
at this point as far as I can tell.


Dan


On Mon November 30 2009 2:09:01 pm Alexandros Karypidis wrote:
> 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(Messag
> >eModeOutInterceptor.java:149)
> >
> >    at
> > org.apache.cxf.jaxws.interceptors.MessageModeOutInterceptor.handleMessage
> >(MessageModeOutInterceptor.java:82)
> >
> >    at
> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorCh
> >ain.java:236)
> >
> >    at
> > org.apache.cxf.ws.addressing.ContextUtils.rebaseResponse(ContextUtils.jav
> >a: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?
> 

-- 
Daniel Kulp
[email protected]
http://www.dankulp.com/blog

Reply via email to