I believe I have found a possible issue in the
org.apache.cxf.jaxws.interceptors.SwAOutInterceptor. The functionality appears
to have changed between 2.1.3 and 2.2.1. I'm not sure which is the correct
functionality so I thought I'd post here first.
This problem occurs when you have a JAXBContextImplementation that does not
have a hasSwaRef method. I found this issue when moving a service from Tomcat
to WebSphere. IBM uses a different implementation of JAXBContext by default
and IBM's version doesn't have a hasSwaRef method on it.
In 2.2.1 this results in a NullPointerException in this block of code:
1 private boolean callSWARefMethod(JAXBContext ctx) {
2 Method m = SWA_REF_METHOD.get(ctx.getClass().getName());
3 if (m == null &&
!SWA_REF_METHOD.containsKey(ctx.getClass().getName())) {
4 try {
5 m = ctx.getClass().getMethod("hasSwaRef", new Class[0]);
6 } catch (Exception e) {
7 //ignore
8 }
9 SWA_REF_METHOD.put(ctx.getClass().getName(), m);
10 }
11 try {
12 return (Boolean)m.invoke(ctx);
13 } catch (Exception e) {
14 return false;
15 }
16 }
This throws the NPE at line 9 SWA_REF_METHOD.put(ctx.getClass().getName(), m);
because m is null. In JDK 1.6.07 ConcurrentHashMap.put() throws a
NullPointerException when the value is null. This causes a SOAPFault to be
returned to the client.
I believe that this code should just return false if the hasSwaRef method
doesn't exist (which is how this operates in 2.1.3). If the put() wasn't
called when m is null, then this code should return true if the method exists
and false if it doesn't.
Fortunately, I can work around this by setting the javax.xml.bind.JAXBContext
system property to the Sun version (com.sun.xml.bind.v2.ContextFactory) which
returns a JAXBContext that implements hasSwaRef().
Let me know if you need any more information from me regarding this issue, I
didn't post it to JIRA since I wasn't sure if the code was performing correctly
yet.
Matt Ault
Systems and Technology
Elavon
----------------------------------------- Note: The information
contained in this e-mail and in any attachments is intended only
for the person or entity to which it is addressed and may contain
confidential and/or privileged material. Any review,
retransmission, dissemination or other use of, or taking of any
action in reliance upon, this information by persons or entities
other than the intended recipient is prohibited. The recipient
should check this e-mail and any attachments for the presence of
viruses. Sender accepts no liability for any damages caused by any
virus transmitted by this e-mail. If you have received this e-mail
in error, please notify us immediately by replying to the message
and delete the e-mail from your computer. Elavon (formerly NOVA
Information Systems)