Camel异常解组JAXB ISO-8859-1 XML文件

时间:2014-05-22 13:58:12

标签: jaxb apache-camel

对于我的路线,我设置:

    String encoding = "iso-8859-1";
    JaxbDataFormat jaxb = new JaxbDataFormat( Data.class.getPackage().getName() );

    if( encoding != null) {
        jaxb.setEncoding( encoding );
    }

    from( "file://" + location + "?charset=" + encoding )
    .routeId(this.getClass().getSimpleName()) // Give a nice name
 . etc.

然后当我提供此ISO编码的文件时,我得到一个异常堆栈:

[com.ctc.wstx.exc.WstxIOException: Invalid UTF-8 start byte 0xfc (at char #3964, byte #127)]
java.io.IOException: javax.xml.bind.UnmarshalException
 - with linked exception:
[com.ctc.wstx.exc.WstxIOException: Invalid UTF-8 start byte 0xfc (at char #3964, byte #127)]
    at org.apache.camel.converter.jaxb.JaxbDataFormat.unmarshal(JaxbDataFormat.java:153)
    at org.apache.camel.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:57)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:73)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
    at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

我可能做错了什么?

1 个答案:

答案 0 :(得分:1)

根据Camel docjaxb.setEncoding无效,因为此参数仅在编组XML文档时使用,而在解组时不使用。

在理想的世界中,prolog中的编码声明(XML文件中的第一个魔术行)与文件的实际编码相匹配:

<?xml version="1.0" encoding="ISO-8859-1"?> 

此信息(或至少应该)由文件读取实用程序(如JAXB)自动使用。

0xfc是ISO-8859-1编码的ü。在您的情况下,请检查prolog编码声明。如果它没有说ISO-8859-1它是伪造的。询问文件的制作者(我希望,你不是......)相应地设置声明。通常,这是由XML编组框架正确完成的。

如果你不能说服文件的制作者设置正确的声明,那么事情变得更加棘手。在这种情况下,您必须知道或猜测编码并在路线中相应地设置驼峰标题:

.setHeader(Exchange.CHARSET_NAME, "ISO-8859-1")

根据JaxbDataFormathere)的源代码,只有filterNonXmlChars实例的JaxbDataFormat属性设置为{{}时,才会考虑此编码。 1}}:

true

或者,您也可以将jaxb.setFilterNonXmlChars(true); 属性设置为Exchange.FILTER_NON_XML_CHARS