对于我的路线,我设置:
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)
我可能做错了什么?
答案 0 :(得分:1)
根据Camel doc,jaxb.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")
根据JaxbDataFormat
(here)的源代码,只有filterNonXmlChars
实例的JaxbDataFormat
属性设置为{{}时,才会考虑此编码。 1}}:
true
或者,您也可以将jaxb.setFilterNonXmlChars(true);
属性设置为Exchange.FILTER_NON_XML_CHARS
。