我有一条路线,其中有一个 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 上下文的构造。这从一开始就会对性能不利,而且无论如何,您的类路径上加载的类都是有限的。
我可以想到几种可能的方法来处理这个问题:
上下文中存在多个包名称。指定
jaxb("org.package1:org.package2:foo.bar")
- 然后 jaxb 希望找到正确的类来解码,无需进一步的逻辑。如果您出于某种原因需要多个(但数量有限)上下文,您可以使用
DataFormat jaxb1 = new JaxbDataFormat("foo.bar:bar.foo");
创建多个上下文,并且然后使用camel中的选择来使用正确的jaxb数据格式。如果您确实想在运行时动态创建上下文(可能会比您想要的更损害您的性能),您可以使用几行代码在简单的 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/