Apache Camel JSON маршалинг в POJO Java Bean
Я думаю, что у меня есть простой вопрос, но, похоже, не могу понять.
Я вызываю POJO с классом, созданным из unmarshalling JSON в качестве параметра для метода. Вопрос в том, как мне организовать возврат из метода обратно в JSON?
мой маршрут ниже;
from("direct:start")
.choice()
.when(header("methodname").isEqualTo("listCases"))
.unmarshal().json(JsonLibrary.Jackson, UserDetails.class)
.to("bean:com.xxx.BeanA")
.when(header("methodName").isEqualTo("listPersons"))
.unmarshal().json(JsonLibrary.Jackson, CaseDetails.class)
.to("bean:com.xxx.BeanB");
...и я вызываю маршрут ниже;
ProducerTemplate template = camelContext.createProducerTemplate();
template.setDefaultEndpoint(camelContext.getEndpoint("direct:start"));
InvocationResult result = (InvocationResult)template.requestBodyAndHeader(payload, "methodName", methodName);
полезная нагрузка-JSON, а имя метода-listCases или listPersons в этом образец.
мой класс InvocationResult является универсальным и содержит атрибут returnCode строки, а также ссылку на объект, который я хотел бы преобразовать в JSON. Этот объект будет отличаться в зависимости от того, выполняется ли listCases или listPersons.
спасибо,
Бик
3 ответов
мое впечатление, что ваша фактическая проблема заключается не в маршаллинге (который должен быть полностью простым), а в обработке ответа после маршрутизации сообщения с помощью choice()
. Вам нужно закрыть choice()
блок с помощью end()
(предполагая, что результат каждой ветви будет обработан одинаково), затем убедитесь, что ответ записывается в out
тело сообщения на последнем этапе маршрута.
в любом случае, вот пример, который я только что проверено:
public class JacksonTestRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("jetty:http://localhost:8181/foo").to("direct:foo");
from("direct:foo")
.unmarshal().json(JsonLibrary.Jackson, Foo.class)
.choice()
.when().simple("${body.foo} == 'toto'")
.log("sending to beanA")
.to("bean:beanA")
.otherwise()
.log("sending to beanB")
.to("bean:beanB")
// close the choice() block :
.end()
// per the javadoc for marshall(), "the output will be added to the out body" :
.marshal().json(JsonLibrary.Jackson);
}
}
public class Foo {
private String foo; // Constructor and accessor omitted for brevity
}
public class Bar1 {
private String bar1; // Constructor and accessor omitted for brevity
}
public class Bar2 {
private String bar2; // Constructor and accessor omitted for brevity
}
public class BeanA {
public Bar1 doSomething(final Foo arg) {
return new Bar1(arg.getFoo() + "A");
}
}
public class BeanB {
public Bar2 doSomething(final Foo arg) {
return new Bar2(arg.getFoo() + "B");
}
}
проводки {"foo":"toto"}
возвращает {"bar1":"totoA"}
(и журналы sending to beanA
).
проводки {"foo":"titi"}
возвращает {"bar2":"titiB"}
(и журналы sending to beanB
).
включить следующую зависимость-
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>2.14.1</version>
</dependency>
определите формат JSON в классе RouteBuilder -
JacksonDataFormat jsonDataFormat = new JacksonDataFormat(Employee.class);
также в классе routebuilder используйте вышеуказанный dataformat следующим образом -
from("file:C:/inputFolder").doTry().unmarshal(xmlDataFormat).
process(new MyProcessor()).marshal(jsonDataFormat).
to("jms:queue:javainuse")
исходный код и более подробная информация - Apache Camel-маршаллинг / Unmarshalling XML / JSON данных