web-dev-qa-db-ja.com

POJOへのApache Camel JSONマーシャリングJava Bean

簡単な質問があると思いますが、理解できないようです。

メソッドのパラメーターとして非整列化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);

ペイロードはJSONであり、この例ではmethodNameはlistCasesまたはlistPersonsです。

私のInvocationResultクラスはジェネリックで、String returnCode属性と、JSONに変換するオブジェクトへのオブジェクト参照が含まれています。このオブジェクトは、listCasesまたはlistPersonsのどちらが実行されるかによって異なります。

おかげで、

ビック

8
bicster

私の印象では、あなたの実際の問題はマーシャリング(完全に簡単である必要があります)ではなく、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");
    }
}

POST中{"foo":"toto"} 戻り値 {"bar1":"totoA"}(およびログsending to beanA)。

POST中{"foo":"titi"} 戻り値 {"bar2":"titiB"}(およびログsending to beanB)。

5
Cyäegha

次の依存関係を含めます

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

RouteBuilderクラスでのJSON形式の定義-

JacksonDataFormat jsonDataFormat = new JacksonDataFormat(Employee.class);

また、routebuilderクラスでは、次のように上記のデータ形式を使用します-

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

ソースコードと詳細-Apache Camel-XML/JSONデータのマーシャリング/アンマーシャリング

2
Rehan

これは.marshal().json(JsonLibrary.Jackson)と同じくらい簡単です(これはあなたが望むものです)

1
Sagar