2016-12-12 7 views
0

外部データベースの項目を検索し、見つかった場合はローカルの項目に保存するサービスを実装しようとしています。 itemSearcherがアイテムを見つけたとき、それが完璧に動作Apache Camel:Beanエンドポイントがnullを返すときにエラーが発生しました

from("direct:find-and-save") 
    .to("bean:itemSearcher?method=searchFor(${header.brand}, ${header.model})") 
    .to("bean:itemConverter") 
    .to("bean:itemRepository?method=saveItem"); 

は、私は、次のルートを持っています。 itemSearcherが見つからない場合はnullを返します。右itemSearcher戻りnullnullが効果的にアウトオブボディとして設定してしまったことを見た後、私はキャメルのコードをデバッグしている

org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: org.apache.camel.converter.stream.InputStreamCache to the required type

:私は、メッセージのボディがnullに設定されますが、私は次の例外を得た期待しましたメッセージを受信した後、次の交換のためにメッセージ中になった。しかし、どこかの身体はInputStreamCacheに置き換えられます。

質問:nullの値をメッセージ本文として保存するにはどうすればよいですか?それが不可能な場合は、豆がCamelの依存関係を持たないようにしてください(つまり、引数としてExchangeインスタンスを取ることはできません)。私は私が読んだのドキュメントで何か欠けている場合

私を指すください。私はキャメルvを使用し

を2.18.0を

+0

フローのさまざまなステップでnullを返すルートがあり、bodyの内容を決定するchoice()/ when()を使用するため、CamelがデフォルトでInputStreamCacheを追加することは本当に疑問です。 nullボディを確認するには、itemConverterの後に条件を追加するとよいでしょう。そして、あなたのアイテムコンバータBeanのコードはどのように見えますか? –

答えて

0

Camel 2.18.0にはこのような誤動作があるようです。

私はバージョンを2.18.1に更新しました(私のコードは変更していません)。nullボディは期待通りに次のエンドポイントに到達しました。

-1

あなたは、ラクダが収束しなければならない方法を呼び出しているのでメソッドを呼び出す前に特定の型に変換します。

値がnullの場合、型を割り当てることができません。

あなたはこの$ {header.brand:ABC}のような値をデフォルトに試すことができ、$ {header.model:空の文字列$ {} header.brandに

ORデフォルト、$ {ABC} header.model :}

+0

質問はヘッダ値に関するものではありません。 'searchFor($ {header.brand}、$ {header.model})'はうまく動作します。この非常にメソッドは 'null'を返し、例外はそれ以降に発生します。 –

-1

私はあなたのヌル体が

.to("bean:itemConverter") 

を取得するために期待するものに変換する必要があるときに例外が発生したと思います。

null bodyを処理するには、itemSearcherとitemConverterの間にプロセッサを追加する必要があります。 少なくともデバッグ目的のために、(プロセッサの実装を持っている)1つを入れて、本体が実際にExchangeでどのように見えるかを見てください。

ところで、私はキャメルのエンドポイントである限り "キャメルの依存関係を持つべきではない"という理由は分かりません。

ADDED:多分bean:itemConverterはObjectをbodyとして受け入れ、bodyが必要な "item"クラスのインスタンスではないときに何をするかを決定できなければなりません。それはhttp://people.apache.org/~dkulp/camel/type-converter.html

でラクダ文書に従って行動を除外されて

+0

私はあなたが提案したとおりにしました。私は '.to(" bean:itemConverter ")'の前に '.process(exchange - > LOGGER.debug(" body is {} "、exchange.getIn()。getBody()))を追加しました。ログには 'body is org.apache.camel.converter.stream.InputStreamCache @ 28f67f4f'があります。 –

+0

BeanはCamelから独立している必要があります。これは、アプリケーションの他の部分で直接依存するためです。他の方法がない場合に限り、いくつかのラッパーを作成します。なぜなら、今のように動作するはずだからです。 –

+0

これは期待されているので... 3つの方法があります - 1.特別なプロセッサー間2. itemConverterはオブジェクトを受け入れて間違ったタイプのボディーを扱わなければなりません3.同じことをするRajesh特別なコンバータによって提案された - body ... – Vadim

-1

あなたがnullチェックを行うには、独自のコンバータを書いてみませんか?例えば context.getTypeConverterRegistry()。addTypeConverter(MyOrder.class、String.class、新しいMyOrderTypeConverter());

詳細については、上記の文書を確認してください。

+0

メッセージ本体をある種類から別の種類に変換できるコンバーターが存在しない場合には、予期される動作です。私には1つもありません。しかし、私は、 'null'ボディが突然' InputStreamCache'インスタンスになることはいつも予想していません。だから私の問題は変換されていない、それは予期しないオブジェクトのメッセージ本文です。 –

関連する問題