2016-04-25 15 views
0

私はラクダのbeanから戻り値を取得し、それを私のルートで使用するのに少し問題があります。キャメル(Java)のBeanからの戻り値の取得

public void testBean (PojoName pojoInstance){ 
    //do stuff 
    int i= 75; //a number I generate within the bean after I've started this method 
} 

は私が私の豆の内側に、私のルートで生成番号を使用したい:

from(file:test/?delete=true) 
.unmarshal(jaxb) 
.bean(testBean, "testMethod") 
.to(direct:nextRoute); 

Beanは次のようになります。

私はこのようになりますルートを持っています。私が試した何

from(file:test/?delete=true) 
    .unmarshal(jaxb) 
    .bean(testBean, "testMethod") 
    .log(integer generated from testBean) 
    .to(direct:nextRoute); 

:このような何か
そうでは、代わりに私のBean内のボイドを返すので、私はintに戻り値の型を変更し、整数を返しました。その後、私は自分のルートでこのような何かを期待していた:私の思考は、私は豆から値を返すと、それは交換体にその値を格納しなければならないことである

.log("${body.intFromBean}") 

(少なくとも、それは私が「何ですCamelのドキュメントから取得しています)。それから私は私のルートでそれにアクセスすることができました。

問題:しかし
、私はintにtestBean戻り値の型を変更したときに、私は次のエラーを取得:。

org.apache.camel.CamelExecutionException: Execution occurred during execution on the exchange 
Caused by: org.apache.camel.InvalidPayloadException: No body available of type: PojoName but has value: numberIGenerated of type java.lang.Integer 

(申し訳ありませんが、私は完全なスタックトレースを持たないI

私の質問:
他のものを読んでから私は問題を理解していると思います。メッセージ本文は1つの型で、戻り型は別の型です。しかし、私が使ってみても。

.convertTo(Integer.class) 

前にBeanを呼び出すが、それもうまくいかなかった。 (概念的には、それをアンマーシャリングした直後にintに変換すると、アンマーシャリングされたデータを使用することができなくなるためですが、とにかく試してみると思っていたからです)。

整数を正しく返す方法を私の理解を深めることができますか?

私は豆の製本と交換に関する文書を読みました。私はこれを行うのに十分理解していると思いました。しかし、私は何かを欠いているに違いない。

+0

完全なスタックトレースと、 testMethodの実装など)は役に立ちます。また、testBeanが定義されている場所では完全なルートが役立ちます。また、これはiffyのように見えます:$ {body.intFromBean}はログステートメントからですが、もっと情報が必要です... –

+1

$ {body.intFromBean}の代わりに.log( "$ {body}")を試しましたか?ラクダはメッセージ本体として結果を保存します。 –

答えて

1

これを使用する必要があるかどうかに応じて、ヘッダーに追加するか、本文にすることができます。ヘッダー(キー/値)に追加し

は、次のようにします。

public class TestBean 
{ 
    @Handler 
    public void testMethod 
    (
     @Body Message inMessage, 
     @Headers Map hdr, 
     Exchange exch 
    ) throws Exception 
    { 
     int i= 75; 
     hdr.put("MyMagicNumber", i); 

    } 

} 

あなたの「リターン」の結果は、現在のヘッダに格納され、あなたは次の手順で、そこからそれを読むことができます。体のために

は、次の手順を実行します

public class TestBean 
{ 
    @Handler 
    public void testMethod 
    (
     @Body Message inMessage, 
     @Headers Map hdr, 
     Exchange exch 
    ) throws Exception 
    { 
     int i= 75; 
     inMessage.setBody(i); 

    } 

} 

メッセージのボディは今、私は含まれています。

3

私は簡単な解決策があることだと思う:

public class TestBean { 
    public int testMethod() { 
     return 75; 
    } 
} 

あなたは、ヘッダーやボディに格納されるリターン結果は、ルート定義次第であるべきかどうか。

TestBean testBean = new TestBean(); 

from("file:test/?delete=true") 
    .unmarshal(jaxb) 
    .bean(testBean, "testMethod") 
    .log("${body}") 
    .to("direct:nextRoute"); 

そして、あなたはヘッダーにそれをしたい場合:

TestBean testBean = new TestBean(); 

from("file:test/?delete=true") 
    .unmarshal(jaxb) 
    .setHeader("MyMagicNumber", method(testBean, "testMethod")) 
    .log("${header.MyMagicNumber}") 
    .to("direct:nextRoute"); 

は、そのように注意してくださいあなたはCamel documentationに読んで

は、デフォルトの動作は、体に戻り値を設定することです2.10より古いCamelバージョンを使用する場合は、メソッドメソッドの代わりに(現在は推奨されていない) "bean"メソッドを使用する必要があります:-)

関連する問題