我认为我有一个简单的问题,但似乎无法弄清楚。
我正在使用从解组JSON创建的类作为方法的参数调用POJO。问题是,如何将方法的返回编组回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);
Payload是JSON,在此示例中,methodName是listCases或listPersons。
我的InvocationResult类是通用的,包含String returnCode属性以及对我想要转换为JSON的对象的对象引用。此对象将根据是否执行listCases或listPersons而不同。
谢谢,
比克
答案 0 :(得分:5)
我的印象是,您的实际问题不是关于编组(这应该是完全直截了当的),而是关于在使用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
)。
答案 1 :(得分:2)
就像这个.marshal().json(JsonLibrary.Jackson)
一样简单(这就是你想要的)