Hi Mark, If you want to preprocess the responses then I'd recommend you to write a custom message builder. You can register the custom message builder in the axis2.xml file against the content type of your responses. There you will be able to include any custom logic along with code for handling invalid characters in the payload.
Here are some useful resources I found on the web: http://charithwiki.blogspot.com/2010/11/how-to-write-axis2-message-builder.html http://wso2.org/library/articles/axis2-configuration-part2-learning-axis2-xml Thanks, Hiranya On Tue, Feb 14, 2012 at 4:34 AM, Matthew Clark <[email protected]>wrote: > Hi all, I'd really appreciate some help with this one... it's hurting my > brain! > > We have a legacy service that I would like to include in some of our ESB > operations. > The legacy service uses XML for both request and response payloads making > it a very easy integration. > > I've created a very simple proxy service (see below). > > The problem I am having is that the legacy service can return some invalid > characters and is causing the stax parser to blow up in such a way that I > can't even handle it gracefully with a fault sequence. I'd really like to > pre-process the responses (before they are parsed/built) as 99% of the time > it is simply a case of replacing characters with numeric character > references or character entity references.. > > We are unable to modify the legacy service to remove these erroneous > responses. > > Heres the proxy config (I said it was simple!!) followed by the Exception > thrown... The exception causes the service to hang and the fault sequence > is only entered after a 60 second timeout. > > <proxy xmlns="http://ws.apache.org/ns/synapse" name="legacyservice" > transports="http" startOnLoad="true"> > > <target endpoint="legacyXMLReceiver"> > > <inSequence> > > <log level="full"> > > <property name="MESSAGE" value="InSequence" /> > > </log> > > </inSequence> > > <outSequence> > > <log level="full"> > > <property name="MESSAGE" value="OutSequence" /> > > </log> > > <send /> > > </outSequence> > > <faultSequence> > > <makefault version="soap11"> > > <code xmlns:soap11Env=" > http://schemas.xmlsoap.org/soap/envelope/" value="soap11Env:Server" /> > > <reason expression="get-property('ERROR_MESSAGE')" /> > > <role /> > > </makefault> > > <log level="full"> > > <property name="MESSAGE" value="FaultSequence" /> > > </log> > > <property name="HTTP_SC" value="500" scope="axis2" /> > > <send /> > > </faultSequence> > > </target> > > </proxy> > > > <endpoint xmlns="http://ws.apache.org/ns/synapse" > name="legacyXMLReceiver"> > > <address uri="http://a.b.c.d:8080/legacyService/LegacyServlet" > format="pox" > > > </address> > > </endpoint> > > > ERROR {org.apache.axis2.transport.base.threads.NativeWorkerPool} - > Uncaught exception > {org.apache.axis2.transport.base.threads.NativeWorkerPool} > *org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxIOException: Invalid > UTF-8 middle byte 0x3c (at char #714, byte #127)* > at > org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) > at > > org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:653) > at > > org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122) > at > > org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.java:343) > at > > org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenIterator.java:36) > at > > org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractIterator.java:58) > at > > org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:555) > at > > org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875) > at > > org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:556) > at > > org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875) > at > > org.apache.axiom.om.impl.util.OMSerializerUtil.serializeChildren(OMSerializerUtil.java:556) > at > > org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:875) > at > > org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:230) > at > > org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:125) > at > > org.apache.axiom.om.impl.llom.OMSerializableImpl.serialize(OMSerializableImpl.java:113) > at > > org.apache.axiom.om.impl.llom.OMElementImpl.toString(OMElementImpl.java:988) > at java.lang.String.valueOf(String.java:2826) > at java.lang.StringBuffer.append(StringBuffer.java:219) > at > > org.apache.synapse.mediators.builtin.LogMediator.getFullLogMessage(LogMediator.java:184) > at > > org.apache.synapse.mediators.builtin.LogMediator.getLogMessage(LogMediator.java:123) > at > > org.apache.synapse.mediators.builtin.LogMediator.mediate(LogMediator.java:91) > at > > org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:60) > at > > org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:114) > at > > org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:229) > at > > org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:370) > at > > org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:160) > at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181) > at > org.apache.synapse.transport.nhttp.ClientWorker.run(ClientWorker.java:275) > at > > org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:173) > at > > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) > at > > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) > at java.lang.Thread.run(Thread.java:680) > *Caused by: com.ctc.wstx.exc.WstxIOException: Invalid UTF-8 middle byte > 0x3c (at char #714, byte #127)* > at com.ctc.wstx.sr.StreamScanner.throwFromIOE(StreamScanner.java:708) > at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1086) > at > > org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225) > at > > org.apache.axiom.util.stax.dialect.DisallowDoctypeDeclStreamReaderWrapper.next(DisallowDoctypeDeclStreamReaderWrapper.java:34) > at > > org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225) > at > > org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681) > at > org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214) > ... 31 more > *Caused by: java.io.CharConversionException: Invalid UTF-8 middle byte 0x3c > (at char #714, byte #127)* > at com.ctc.wstx.io.UTF8Reader.reportInvalidOther(UTF8Reader.java:313) > at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:204) > at com.ctc.wstx.io.MergedReader.read(MergedReader.java:101) > at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:84) > at > > com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:57) > at > com.ctc.wstx.sr.StreamScanner.loadMoreFromCurrent(StreamScanner.java:1046) > at > com.ctc.wstx.sr.StreamScanner.loadMoreFromCurrent(StreamScanner.java:1053) > at > com.ctc.wstx.sr.StreamScanner.getNextInCurrAfterWS(StreamScanner.java:892) > at > > com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:2963) > at > > com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2936) > at > com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2848) > at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1019) > -- Hiranya Jayathilaka Associate Technical Lead; WSO2 Inc.; http://wso2.org E-mail: [email protected]; Mobile: +94 77 633 3491 Blog: http://techfeast-hiranya.blogspot.com
