【问题标题】:apache camel variable ${body} gets not converted after unmarshalling解组后未转换 apache 骆驼变量 ${body}
【发布时间】:2015-11-02 18:04:07
【问题描述】:

在我的 RouteBuilder 中,我有这个:

JaxbDataFormat jaxb = new JaxbDataFormat(); 
jaxb.setContext(JAXBContext.newInstance(MyClass.class));
from("direct:start")
   .unmarshal(jaxb)
   .process(new MyProcessor())
   .log(LoggingLevel.INFO, "test.Test", "${body}")
...

MyProcessor 只是这样做:

MyClass myClass = exchange.getIn().getBody(MyClass.class);
LOGGER.info("Converted to: {}", myClass );

好吧,当我的处理器中的 LOGGER 记录 myClass.toString() 时,路由中的日志组件记录原始 XML 消息体。现在我有点困惑。如果我在 MyProcessor 中设置断点,那么我可以看到 exchange.getIn().getBody(MyClass.class) 确实包含 MyClass 的实例。但是为什么之后日志组件中的 ${body} 仍然是 XML?

谢谢, 尼克

【问题讨论】:

标签: java jaxb apache-camel


【解决方案1】:

可能是因为您没有将交换中的主体设置为您想要的任何内容。您只做了一个“getBody”,因此原始 xml 仍然是交换的主体。

你能改成下面这样吗:

MyClass myClass = exchange.getIn().getBody(MyClass.class);
LOGGER.info("Converted to: {}", myClass );
exchange.getIn().setBody(myClass.toString());

【讨论】:

  • 谢谢,很遗憾:exchange.getIn().setBody(myClass); 没有任何改变。
  • 好的,使用myClass.toString() 它可以工作,但是我在消息中有一个字符串作为正文。我认为可以在这里使用对象。我想做进一步的处理等等,因此我需要 JAXB 对象而不是字符串。
  • 当然可以,但是您想在处理器之外记录正文。如果您发送对象,那么它看起来不会很好。因此,对于日志记录,它需要是字符串。但是对于处理和其他内容,您可以将其保留为对象并将其从一个处理器传递到另一个处理器。
  • 谢谢,但我的问题是:没有toString()exchange.getIn().setBody(myClass); 不会在${body} 的日志组件中记录对象。它记录原始 XML 消息正文,就像它在解组之前一样。当我在登录路由后添加一个新组件时,它使用 xml-Body 而不是 JAXB-Object 作为输入。
  • 我假设您在类路径中添加了引用正确数据格式的 jaxb 文件?请参阅此处的示例 camel-jaxb。 github.com/apache/camel/tree/master/components/camel-jaxb
猜你喜欢
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多