On Friday 29 August 2008 11:51:53 am Martijn Brinkers wrote:
> The problem is that Strings can contain those illegal characters as
> discussed on Benson's blog. So to make sure that the produced XML is
> valid all Strings need to be filtered. Is it possible to do this
> filtering by CXF automagically before sending out the final XML?

Couple thoughts:
1) JAXB allows you to easily send messages that are not schema compliant.  By 
default, JAXB doesn't validate it's datasets.   For example, you could have a 
minOccurs="2" maxOccurs="10" element, but only put a single value in the List 
and JAXB will happily send it.   If you want strict compliance, you need to 
turn schema validation on (which results in a performance penalty) or make 
sure the dataset you produce it valid per schema. 

2) In this particular case, you COULD write an XMLStreamWriter that wrappers 
the original writer and overrides the writeCharacters method to do any 
filtering you need.   I wouldn't make this a default as performance would 
suffer for the "normal" usecases where this isn't needed.   This is just like 
schema validation.   It's useful, but is a performance hit so should be 
turned on by the developer if the developer feels it's needed and/or 
required.

Dan


> Martijn
>
> On Fri, 2008-08-29 at 11:44 -0400, Daniel Kulp wrote:
> > Control characters like that are illegal in XML.  You can read Benson's
> > blog about it:
> > http://dssheep.blogspot.com/2008/01/xml-10-versus-web-services.html
> >
> > Technically, I would consider this a bug in the JAXB marshaller as this
> > should have thrown an exception at write time, not read time.    If you
> > turn on schema validation on the send side, it might throw an exception,
> > not really sure.
> >
> > Dan
> >
> > On Thursday 28 August 2008 6:01:00 pm Martijn Brinkers wrote:
> > > Hi,
> > >
> > > I use CXF as a soap server and CXF as a soap client. In one of my soap
> > > calls I return a String but sometimes this results in a
> > > WstxUnexpectedCharException.
> > >
> > > "WstxUnexpectedCharException: Illegal character ((CTRL-CHAR, code 27))"
> > >
> > > I read that a WstxUnexpectedCharException can be caused by a HTML
> > > server returning HTML content but that's not the case here. The string
> > > that's returned is returned by my CXF soap server. Shouldn't it be
> > > escaped or something?
> > >
> > > Thanks,
> > >
> > > Martijn Brinkers
> > >
> > > PS. I use CXF 2.1
> > >
> > >
> > >
> > > Partial stacktrace
> > >
> > > Caused by: org.apache.cxf.interceptor.Fault: Unmarshalling Error:
> > > Illegal character ((CTRL-CHAR, code 27))
> > > at [row,col {unknown-source}]: [7,1]
> > > at
> > > org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.ja
> > >va:6 42) at
> > > org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.ja
> > >va:5 55) at
> > > org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:64) at
> > > org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLit
> > >eral InInterceptor.java:102) at
> > > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptor
> > >Chai n.java:221) at
> > > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:429) at
> > > org.apache.cxf.transport.http.HTTPConduit
> > > $WrappedOutputStream.handleResponse(HTTPConduit.java:1988)
> > > at org.apache.cxf.transport.http.HTTPConduit
> > > $WrappedOutputStream.close(HTTPConduit.java:1824)
> > > at
> > > org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
> > > at
> > > org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:583)
> > > at org.apache.cxf.interceptor.MessageSenderInterceptor
> > > $MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.
> > >java
> > >
> > >:62) at
> > >
> > > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptor
> > >Chai n.java:221) at
> > > org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:276)
> > > at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:222)
> > > at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
> > > at
> > > org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:177)
> > > ... 111 more
> > > Caused by: javax.xml.bind.UnmarshalException
> > > - with linked exception:
> > > [com.ctc.wstx.exc.WstxUnexpectedCharException: Illegal character
> > > ((CTRL-CHAR, code 27))
> > > at [row,col {unknown-source}]: [7,1]]
> > > at
> > > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamE
> > >xcep tion(UnmarshallerImpl.java:422) at
> > > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Un
> > >mars hallerImpl.java:360) at
> > > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unm
> > >arsh allerImpl.java:337) at
> > > org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.ja
> > >va:6 28) ... 126 more
> > > Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Illegal
> > > character ((CTRL-CHAR, code 27))
> > > at [row,col {unknown-source}]: [7,1]
> > > at
> > > com.ctc.wstx.sr.StreamScanner.throwInvalidSpace(StreamScanner.java:650)
> > > at
> > > com.ctc.wstx.sr.BasicStreamReader.readTextSecondary(BasicStreamReader.j
> > >ava: 4666) at
> > > com.ctc.wstx.sr.BasicStreamReader.readCoalescedText(BasicStreamReader.j
> > >ava: 4124) at
> > > com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:36
> > >99) at
> > > com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.jav
> > >a:36 47) at
> > > com.ctc.wstx.sr.BasicStreamReader.getTextCharacters(BasicStreamReader.j
> > >ava: 830) at
> > > org.apache.cxf.staxutils.DepthXMLStreamReader.getTextCharacters(DepthXM
> > >LStr eamReader.java:159) at
> > > com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleChar
> > >acte rs(StAXStreamConnector.java:356) at
> > > com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StA
> > >XStr eamConnector.java:220) at
> > > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Un
> > >mars hallerImpl.java:358) ... 128 more



-- 
Daniel Kulp
[EMAIL PROTECTED]
http://www.dankulp.com/blog

Reply via email to