如何在没有 Spring 的情况下从 XML 片段实例化 Camel 组件?
说,我有一个片段,是这样的:
<dataFormats>
<json id="jack" library="Jackson" prettyPrint="true"/>
....
</dataFormats>
,我想对其进行解析并有效地为我返回,因为
JsonDataFormat jack = new JsonDataFormat(JsonLibrary.Jackson);
jack.setPrettyPrint(true);
甚至是这样的事情,我希望能够从以下位置实例化处理器:
<setHeader headerName="inputRegistryHandler">
<simple>${header.CamelFileNameOnly}</simple>
</setHeader>
<mvel>request.headers.foo == 'bar'</mvel>
等等
希望在 Camel 3 中不会放弃 XML 支持?
解决方案
按照下面的@Sergei I. 建议,我写了如下内容
JAXBContext jc = JAXBContext.newInstance("org.apache.camel.model:org.apache.camel.model.language");
Unmarshaller unmarshal = jc.createUnmarshaller();
ProcessorDefinition pd = (ProcessorDefinition) unmarshal.unmarshal(serviceDefinitionElement);
rc = new DefaultRouteContext(_camelContext);
Processor processor = pd.createProcessor(rc);
_camelContext.addService(processor, true);
它吃了一个 DOM 元素,其中包含
<camel:setBody>
<camel:simple>mike check one two</camel:simple>
</camel:setBody>
像魅力一样,创造一个功能强大的处理器
可能我需要添加更多的 java 包才能解析更多类型的 Camel XML 片段
更新 我必须添加_camelContext.addService(processor, true);到上面的解决方案中。这个神奇的东西将所有 Camel Context bean 加载到处理器中,这使我们能够省略一些配置。例如,这将在ObjectMapper没有我们特别提及的情况下添加到 Jackson 数据格式,并且prettyPrint标志开始被resected:
<camel:unmarshal>
<camel:jacksonxml unmarshalTypeName="java.util.Map"/>
</camel:unmarshal>
<camel:marshal>
<camel:json library="Jackson" prettyPrint="true"/>
</camel:marshal>
慕容708150
一只斗牛犬
相关分类