[ 
https://issues.apache.org/jira/browse/CXF-9037?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]
Andriy Redko updated CXF-9037:
------------------------------
    Fix Version/s: 3.5.10
                   3.6.5
                   4.0.6
                       (was: 3.5.8)
                       (was: 4.0.4)
                       (was: 3.6.3)

> NPE when using com.ctc.wstx.returnNullForDefaultNamespace=true
> --------------------------------------------------------------
>
>                 Key: CXF-9037
>                 URL: https://issues.apache.org/jira/browse/CXF-9037
>             Project: CXF
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 3.5.8, 3.6.3, 4.0.4
>            Reporter: Gordon Freeman
>            Priority: Major
>             Fix For: 3.5.10, 3.6.5, 4.0.6
>
>         Attachments: xmlTest.zip
>
>
> I am using custom out interceptor, which make xsl transformation to serialize 
> some elements as CDATA, my code was inspired by 
> org.apache.cxf.feature.transform.XSLTOutInterceptor.
> But if I set property com.ctc.wstx.returnNullForDefaultNamespace=true, the 
> I've got an NPE. This property is required to fix some other issues with xml 
> generation (without it I've got empty namespaces xmlns="" in some cases).
> The code bellow is the minimum example of NPE, using 
> org.apache.cxf.staxutils.StaxSource.
>  
> {code:java}
> Exception in thread "main" java.lang.NullPointerException: Cannot invoke 
> "String.equals(Object)" because "prefix" is null 
>        at 
> net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping(ReceivingContentHandler.java:300)
>  
>        at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:145) 
>        at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:259) 
>        at 
> net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:192) 
>        at net.sf.saxon.event.Sender.send(Sender.java:104) 
>        at 
> net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:364)
> {code}
> {code:java}
> package test;
> import com.ctc.wstx.stax.WstxInputFactory;
> import org.apache.cxf.staxutils.StaxSource;
> import javax.xml.transform.OutputKeys;
> import javax.xml.transform.Source;
> import javax.xml.transform.Transformer;
> import javax.xml.transform.TransformerFactory;
> import javax.xml.transform.stax.StAXSource;
> import javax.xml.transform.stream.StreamResult;
> import java.io.ByteArrayInputStream;
> import java.io.StringWriter;
> import java.nio.charset.StandardCharsets;
> public class NpeTest
> {
>     public static void main(String[] args) throws Exception
>     {
>         String bodyXml = "<?xml version=\"1.0\"?>\n" +
>                 "<soap:Envelope 
> xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\";>\n" +
>                 "  <soap:Body>\n" +
>                 "    <testReq xmlns=\"http://test.com/test\";>\n" +
>                 "        <reqBody>&lt;&lt;&lt;&lt;&lt;</reqBody>\n" +
>                 "    </testReq>\n" +
>                 "  </soap:Body>\n" +
>                 "</soap:Envelope>\n";
>         System.setProperty("com.ctc.wstx.returnNullForDefaultNamespace", 
> "true");
>         WstxInputFactory factory = new WstxInputFactory();
>         Source beforeSource = new 
> StaxSource(factory.createXMLStreamReader(new 
> ByteArrayInputStream(bodyXml.getBytes(StandardCharsets.UTF_8))));
> //        Source beforeSource = new 
> StAXSource(factory.createXMLStreamReader(new 
> ByteArrayInputStream(bodyXml.getBytes(StandardCharsets.UTF_8))));
>         System.out.println(save(beforeSource));
>     }
>     public static String save(Source beforeSource) throws Exception
>     {
>         StringWriter writer = new StringWriter();
>         StreamResult result = new StreamResult(writer);
>         TransformerFactory tf = TransformerFactory.newInstance();
>         Transformer transformer = tf.newTransformer();
>         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
>         transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
>         transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, 
> "Q{http://test.com/test}reqBody";);
>         
> transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount";, 
> "4");
>         transformer.transform(beforeSource, result);
>         return writer.toString();
>     }
> }
> {code}
> The stacktrace from my project is:
> {code:java}
> java.lang.NullPointerException
>         at 
> net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping(ReceivingContentHandler.java:301)
>         at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:145)
>         at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:259)
>         at 
> net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:190)
>         at net.sf.saxon.event.Sender.send(Sender.java:105)
>         at 
> net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:364)
>         at 
> org.apache.cxf.feature.transform.XSLTUtils.transform(XSLTUtils.java:57)
>         at 
> org.apache.cxf.feature.transform.XSLTOutInterceptor$XSLTCachedOutputStreamCallback.onClose(XSLTOutInterceptor.java:165)
>         at 
> org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:219)
>         at 
> org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
>         at 
> org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:688)
>         at 
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
>         at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>         at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
>         at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441)
>         at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356)
>         at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314)
>         at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
>         at 
> org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to