2016-12-12 41 views
0

我試圖實現,搜索外部數據庫的項目的服務,如有發現,將其保存在當地的一個。Apache的駱駝:錯誤時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發現的項目。當itemSearcher找不到該項目時,它將返回null。我預期消息的該機構將被設置爲null但我得到以下異常:之後itemSearcher回報null和看到null有效地得到了設置的OUT-體

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

我已經調試駱駝的代碼當前交換的消息,然後出口消息成爲下一個交換的消息。但是無論如何,某處的身體都會被InputStreamCache取代。

我的問題是:我怎麼可以配置駱駝保護null值作爲消息的身體嗎?如果這是不可能的,我該如何解決讓bean不應該擁有Camel的依賴關係(即不能以Exchange實例爲參數)。

請點我,如果我失去了在文檔中的東西我讀過:

我用駱駝v 2.18.0

+0

我真的懷疑Camel默認添加InputStreamCache,因爲我有在流程的各個步驟中返回null的路由,我使用choice()/ when()來確定正文的內容。你可能想在itemConverter之後添加一個條件來檢查一個空體。以及你的物品轉換器bean中的代碼是怎樣的? –

回答

0

駱駝2.18.0似乎有這種不良行爲。

我已將版本更新至2.18.1(未更改我的任何代碼),並且現在null正文按預期方式進入下一個端點。

-1

由於您正在調用camel必須轉換的方法t調用該方法之前的特定類型。

如果該值爲null,則它將不能夠分配一個類型。

可你試試默認值,這樣$ {header.brand:ABC} $ {header.model:ABC}

或默認爲空字符串$ {header.brand:} $ {header.model :}

+0

問題不在於標題值。 'searchFor($ {header.brand},$ {header.model})'工作正常。這個方法可能會返回'null',之後發生異常。 –

-1

我猜當你的身體空需要轉換到什麼

.to("bean:itemConverter") 

期望得到異常情況發生。

也許你需要itemSearcher和itemConverter之間的附加處理器來處理空體。 至少爲了調試目的,嘗試放置一個(其具有Processor實現)並查看Exchange在實際中的外觀。

BTW:我不知道爲什麼「豆不應該有駱駝的依賴關係」,只要它們是駱駝端點?

新增:也許豆:itemConverter必須能夠接受對象爲身體,然後決定什麼時候身體不需要「項」類的實例做什麼。

+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

它是根據http://people.apache.org/~dkulp/camel/type-converter.html

你能試着編寫自己的轉換器做一個空檢查駱駝文件除外行爲?例如。 ()MyType.getTypeConverter()。

查看上述文檔以獲取更多詳細信息。

+0

當沒有可以將消息正文從一種類型轉換爲另一種類型的轉換器時,預計會出現這種情況。而我沒有一個。但是我從未期望'null'體突然變成'InputStreamCache'實例。所以我的問題不在轉換中,它是消息體中的意外對象。 –