Как создать экземпляр компонента Camel из фрагмента XML без Spring?
Скажите, у меня есть фрагмент, примерно такой:
<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>
и т.д.
Надеюсь, поддержка XML не будет отменена в Camel 3?
Решение
Следуя совету @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 в процессор, что дает нам возможность пропустить некоторую конфигурацию. Например, это добавит ObjectMapper
к формату данных Джексона без нашего упоминания об этом, и флаг prettyPrint
начнет пересекаться:
<camel:unmarshal>
<camel:jacksonxml unmarshalTypeName="java.util.Map"/>
</camel:unmarshal>
<camel:marshal>
<camel:json library="Jackson" prettyPrint="true"/>
</camel:marshal>