[ https://issues.apache.org/jira/browse/CXF-9037?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gordon Freeman updated CXF-9037: -------------------------------- Description: 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><<<<<</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} was: 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><<<<<</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} > 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.8, 3.6.3, 4.0.4 > > 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><<<<<</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)