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