web-dev-qa-db-fra.com

Apache Camel JSON Marshalling vers POJO Java Bean

Je pense avoir une question simple, mais je n'arrive pas à comprendre.

J'invoque un POJO avec une classe créée à partir de JSON inchangé en tant que paramètre de la méthode. La question qui se pose est de savoir comment organiser le retour de la méthode vers JSON.

Mon itinéraire est ci-dessous;

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");

... et j'invoque la route par le bas;

ProducerTemplate template = camelContext.createProducerTemplate();
template.setDefaultEndpoint(camelContext.getEndpoint("direct:start"));
InvocationResult result = (InvocationResult)template.requestBodyAndHeader(payload, "methodName", methodName);

La charge utile est JSON, et le nomMéthode est listCases ou listPersons dans cet exemple.

Ma classe InvocationResult est générique et contient un attribut String returnCode ainsi qu'une référence d'objet à l'objet que je voudrais convertir en JSON. Cet objet sera différent selon que listCases ou listPersons est exécuté.

Merci,

Bic

6
bicster

Mon impression est que votre problème actuel ne concerne pas le marshalling (ce qui devrait être tout à fait simple), mais le traitement d'une réponse après avoir acheminé le message à l'aide de choice(). Vous devez fermer le bloc choice() à l'aide de end() (en supposant que le résultat de chaque branche sera traité de la même manière), puis assurez-vous que la réponse est écrite dans le corps du message out à la dernière étape de la route.

Quoi qu'il en soit, voici un exemple que je viens de tester:

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");
    }
}

POSTing {"foo":"toto"} renvoie {"bar1":"totoA"} (et enregistre sending to beanA).

POSTing {"foo":"titi"} renvoie {"bar2":"titiB"} (et enregistre sending to beanB).

5
Cyäegha

inclure les dépendances suivantes

      <dependency>
            <groupId>org.Apache.camel</groupId>
            <artifactId>camel-jackson</artifactId>
            <version>2.14.1</version>
        </dependency>

Définir le format JSON dans la classe RouteBuilder -

JacksonDataFormat jsonDataFormat = new JacksonDataFormat(Employee.class);

Également dans la classe routebuilder, utilisez le format de données ci-dessus comme suit -

from("file:C:/inputFolder").doTry().unmarshal(xmlDataFormat).
        process(new MyProcessor()).marshal(jsonDataFormat).
        to("jms:queue:javainuse")

Code source et plus de détails - Apache Camel - Traitement des données XML/JSON

2
Rehan

C'est aussi simple que ce .marshal().json(JsonLibrary.Jackson) (c'est ce que vous voulez)

1
Sagar