Hi thanks for that - for some reason I had overlooked the message builders..
I have a rudimentary version of this working now but given the various classes available (XMLStreamReader, StAXbuilder and so on), what would be the most efficient way to do the replacement? I have about 40 characters (such as the pound sign) that I would like to replace with entity references... For the first version, I simply converted to a string used StringUtils.replaceEach() but this is obviously not ideal.. On 14 February 2012 04:32, Hiranya Jayathilaka <[email protected]> wrote: > 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 >
