【问题标题】:Camel exceptions unmarshalling JAXB ISO-8859-1 XML fileCamel 异常解组 JAXB ISO-8859-1 XML 文件
【发布时间】:2014-05-22 13:58:11
【问题描述】:

对于我设置的路线:

    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)

我做错了什么?

【问题讨论】:

  • 基本上这个错误是报告一个特殊字符存在并且它不喜欢它
  • 我不能正确设置 iso-8559-1 编码,但我不知道应该是什么 - 我无法从 camel jaxb 中找到更好的信息
  • 我一直对这个问题投反对票,但也无法删除它。什么给了?

标签: jaxb apache-camel


【解决方案1】:

根据Camel doc,jaxb.setEncoding 将无济于事,因为此参数仅在编组 XML 文档时使用,而在解组它们时不使用。

在理想情况下,序言中的编码声明(XML 文件中的第一行)与文件的实际编码相匹配:

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

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

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

如果你不能说服文件的生产者设置正确的声明,那么事情就会变得越来越棘手。在这种情况下,您必须知道或猜测编码并在路由中相应地设置骆驼头:

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

根据JaxbDataFormat(here)的源码,只有JaxbDataFormat实例的filterNonXmlChars属性设置为true时才考虑这种编码:

jaxb.setFilterNonXmlChars(true);

或者,您也可以将Exchange.FILTER_NON_XML_CHARS 属性设置为true。

【讨论】:

  • 没错,你设置了 jaxb.setFilterNonXmlChars( true );它有效。你是对的 setEncoding 没有效果,我需要的是上面的那一行。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2017-09-30
  • 2012-07-23
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多