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 данных


Это просто .marshal().json(JsonLibrary.Jackson) (Это то, что вы хотите)