Apache Camel JSON编组到POJO Java Bean

时间:2016-11-23 04:27:07

标签: json apache-camel marshalling unmarshalling

我认为我有一个简单的问题,但似乎无法弄清楚。

我正在使用从解组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而不同。

谢谢,

比克

2 个答案:

答案 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)一样简单(这就是你想要的)