[ https://issues.apache.org/activemq/browse/SM-722?page=comments#action_37293 ] Renaud Bruyeron commented on SM-722: ------------------------------------
mmhh, I am not sure the ConsumerProcessor is using a sourceTransformer to parse the incoming SOAP message: {code:java|title=org.apache.servicemix.http.processors.ConsumerProcessor} SoapMessage message = soapHelper.getSoapMarshaler().createReader().read( request.getInputStream(), request.getHeader(Constants.HEADER_CONTENT_TYPE)); {code} In my case, the SoapReader uses the readSoapUsingStax(...) method. The relevant code is: {code:title=org.apache.servicemix.soap.marshalers.SoapReader line 187} private SoapMessage readSoapUsingStax(InputStream is) throws Exception { SoapMessage message = new SoapMessage(); XMLStreamReader reader = marshaler.getInputFactory().createXMLStreamReader(is); reader = new ExtendedXMLStreamReader(reader); // skipping... // Create Source for content if (reader.nextTag() != XMLStreamConstants.END_ELEMENT) { QName childName = reader.getName(); message.setBodyName(childName); // Check for fault if (childName.equals(new QName(soapUri, SoapMarshaler.FAULT))) { message.setFault(readFaultUsingStax(reader)); } else { message.setSource(new StaxSource(new FragmentStreamReader(reader))); } } {code} As you can see, it is using the ExtendedXMLStreamReader to wrap the reader, therefore whitespace-only nodes get trimmed. By the way in DOM mode, the SoapReader uses the DocumentBuilderFactory directly: {code:title=org.apache.servicemix.soap.marshalers.SoapReader line 91} private SoapMessage readSoapUsingDom(InputStream is) throws Exception { SoapMessage message = new SoapMessage(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); Document doc = factory.newDocumentBuilder().parse(is); {code} > ExtendedXMLStreamReader strips whitespaces, which breaks servicemix-http when > a SOAP invocation contains whitespace nodes > ------------------------------------------------------------------------------------------------------------------------- > > Key: SM-722 > URL: https://issues.apache.org/activemq/browse/SM-722 > Project: ServiceMix > Issue Type: Bug > Components: servicemix-core > Affects Versions: 3.0 > Reporter: Renaud Bruyeron > Fix For: 3.0.1 > > > The problem is in the code below in ExtendedXMLStreamReader, which is used by > SoapMarshaler to extract the SOAP message from a http invocation, and put it > in a NormalizedMessage. > I have a SOAP message that has things like this: <text> </text>. The > whitespace is significant, and should not be trimmed, yet the message comes > out as <text/>. > Is there a reason for explicitely doing this? > public int nextTag() throws XMLStreamException { > int eventType = next(); > while((eventType == XMLStreamConstants.CHARACTERS && isWhiteSpace()) > // skip whitespace > || (eventType == XMLStreamConstants.CDATA && isWhiteSpace()) > // skip whitespace > || eventType == XMLStreamConstants.SPACE > || eventType == XMLStreamConstants.PROCESSING_INSTRUCTION > || eventType == XMLStreamConstants.COMMENT > ) { > eventType = next(); > } > if (eventType != XMLStreamConstants.START_ELEMENT && eventType != > XMLStreamConstants.END_ELEMENT) { > throw new XMLStreamException("expected start or end tag", > getLocation()); > } > return eventType; > } -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: https://issues.apache.org/activemq/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira