簡単な質問があると思いますが、理解できないようです。
メソッドのパラメーターとして非整列化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のどちらが実行されるかによって異なります。
おかげで、
ビック
私の印象では、あなたの実際の問題はマーシャリング(完全に簡単である必要があります)ではなく、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
)。
次の依存関係を含めます
<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")
これは.marshal().json(JsonLibrary.Jackson)
と同じくらい簡単です(これはあなたが望むものです)