users@jax-ws.java.net

NPE inside SOAPEncoder

From: Ken Robinson <ken.robinson_at_apollogrp.edu>
Date: Mon, 23 Oct 2006 17:08:55 -0700

Hi all -

We've got a schema setup as follows, with one of the elements being an
extension of an abstract supertype:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:base="http://generic" xmlns:v1="http://someurl"
targetNamespace="http://someurl">
  <xsd:import namespace="http://generic" schemaLocation="base.xsd"/>
  <xsd:element name="operation">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="response" type="base:Response"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="subtype">
    <xsd:complexContent>
      <xsd:extension base="base:supertype">
        <xsd:sequence>
          <xsd:element name="someElement" type="v1:someType"
minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="someType">
    <xsd:sequence>
      <xsd:element name="result" type="xsd:boolean"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

With the supertype being defined as:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://generic"
            xmlns:base="http://generic">
   <xsd:complexType name="Response">
      <xsd:sequence>
         <xsd:element name="details" type="base:superType"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="supertype" abstract="true">
   </xsd:complexType>
</xsd:schema>


The problem I'm getting is an NPE inside SOAPEncoder at line 366 when I
try to serialize a document conforming to this schema:

com.sun.xml.ws.protocol.soap.server.SOAPMessageDispatcher receive
SEVERE: Error in encoding SOAP Message
Error in encoding SOAP Message
        at
com.sun.xml.ws.encoding.soap.server.SOAPXMLEncoder.toSOAPMessage(SOAPXML
Encoder.java:113)
        at
com.sun.xml.ws.protocol.soap.server.SOAPMessageDispatcher.makeSOAPMessag
e(SOAPMessageDispatcher.java:350)
        at
com.sun.xml.ws.protocol.soap.server.SOAPMessageDispatcher.receive(SOAPMe
ssageDispatcher.java:155)
        at com.sun.xml.ws.server.Tie.handle(Tie.java:88)
        at
com.sun.xml.ws.transport.http.servlet.WSServletDelegate.handle(WSServlet
Delegate.java:333)
        at
com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServlet
Delegate.java:288)
        at
com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:77
)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:237)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:157)
        at
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilte
r.java:75)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:186)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:157)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv
e.java:214)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
20)
        at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardCon
textValve.java:198)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv
e.java:152)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:104)
        at
org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipa
lValve.java:44)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:102)
        at
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAs
sociationValve.java:169)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:102)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
20)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java
:137)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:104)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java
:118)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:102)
        at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:535
)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:102)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
20)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.
java:109)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveCo
ntext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:5
20)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
        at
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:79
9)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processC
onnection(Http11Protocol.java:705)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:57
7)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool
.java:683)
        at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.NullPointerException
        at
com.sun.xml.ws.encoding.soap.SOAPEncoder.serializeReader(SOAPEncoder.jav
a:365)
        at
com.sun.xml.ws.encoding.soap.SOAPEncoder.serializeSource(SOAPEncoder.jav
a:437)
        at
com.sun.xml.ws.encoding.soap.SOAPEncoder.writeBody(SOAPEncoder.java:573)
        at
com.sun.xml.ws.encoding.soap.server.SOAPXMLEncoder.toSOAPMessage(SOAPXML
Encoder.java:95)
        ... 41 more

An example instance doc:

<ns:operation xsi:schemaLocation="http://someurl
http://someurl/schema.xsd" xmlns:ns="http://someurl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <response>
    <message/>
    <details xsi:type="ns:subtype" xmlns:ns="http://someurl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <someElement>
        <result>true</result>
      </someElement>
    </details >
  </response>
</ns:operation>

The offending code:

if (writerURI == null || ((nsPrefix.length() == 0) || (prefix.length()
== 0)) ||
    (!nsPrefix.equals(prefix) && !writerURI.equals(readerURI)))
{

When attempting to encode the sample response above, it throws the NPE
because writerURI is not null, and nsPrefix is not empty, but prefix is
null for the details element. I should mention that this was using
Dispatch and Provider api rather than using JAXB. I had the same
results under 2.0 and 2.1 of jax-ws. Both xerces and xmlbeans indicate
that the instance doc is valid, and I have no problem returning the same
doc under jax-rpc. Any thoughts?

Thanks,
Ken