java - Camel 和 JAXB : Dynamic contextPath using simple()

标签 java jaxb apache-camel

我有一条路线,其中有一个 XML 文件列表作为输入,我想通过 JAXB 对其进行解码和处理。

这是我添加到 route 的内容:

.unmarshal().jaxb("foo.bar.camel.xmlbeans.CLIENTID")

这按预期工作,但我需要 CLIENTID 属性是动态的。该信息包含在消息 header 内,因此我尝试了以下操作:

.unmarshal().jaxb("foo.bar.camel.xmlbeans." + simple("${client.clientId}"))

这不起作用,因为 simple() 返回 SimpleBuilder 并且我没有解决方案来获取实际值...我想使用 .evaluate (exchange, type) 但我找不到如何从路由内访问 exchange

我怎样才能实现这一目标?

最佳答案

您必须小心构建路由时应用的逻辑以及路由交换时应用的逻辑。令人困惑的是,有两个抽象层次、两种语言——Java 和 Camel DSL。

在您的情况下,您的 java 运行时正在尝试在构造 java 运行时评估 String + SimpleBuilder。

我认为 Camel 中没有从交换参数提供动态 JAXB 上下文的构造。这从一开始就会对性能不利,而且无论如何,您的类路径上加载的类都是有限的。

我可以想到几种可能的方法来处理这个问题:

  1. 上下文中存在多个包名称。指定 jaxb("org.package1:org.package2:foo.bar") - 然后 jaxb 希望找到正确的类来解码,无需进一步的逻辑。

  2. 如果您出于某种原因需要多个(但数量有限)上下文,您可以使用 DataFormat jaxb1 = new JaxbDataFormat("foo.bar:bar.foo"); 创建多个上下文,并且然后使用camel中的选择来使用正确的jaxb数据格式。

  3. 如果您确实想在运行时动态创建上下文(可能会比您想要的更损害您的性能),您可以使用几行代码在简单的 java 处理器中轻松完成此操作。

    公共(public)类 Proc 实现处理器 { public void process(Exchange交换)抛出异常{ String clientId = Exchange.getIn().getHeader("clientid"); JAXBContext jaxb = JAXBContext.newInstance("foo.bar."+ clientId); 解码器解码器 = jaxb.createUnmarshaller(); InputStream 输入 = Exchange.getIn(InputStream.class); Exchange.getIn().setBody(unmarshaller.unmarshal(input)); } }

关于java - Camel 和 JAXB : Dynamic contextPath using simple(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034242/

相关文章:

java - 关于如何获取测试 jar 来运行单独的测试 war 的指针(也许与 cargo ?)

java - 如何从java中的时区偏移量获取时区?

java - NoMessageBodyWriterFoundFailure : Could not find MessageBodyWriter for response object of type

Java xml 序列化 null 处理

apache-camel - Apache Camel - 死信 channel - 丰富消息

java - 使用 Spring Batch 逐行插入数据修复列表大小问题

java - 在集合中使用 Integer 或 int for every

java - 如何从数据库查询返回ArrayList?

java - Apache Camel 作为反向代理

java - Camel 传奇 : Coordinating a saga across two web-services