2016-04-20 46 views
2

我試圖通過lambda表達式創建郵件過濾器頭價值評估如何在Spring集成Java DSL中創建MessageSelector過濾器?

IntegrationFlows.from(inputChannel()) 
    .filter((Message<?> m) -> { return m.getHeaders().get(...)...; }) 
    .transform(...) 
    .channel(outputChannel()) 
    .get(); 

的基礎上過濾消息,但得到的異常

Caused by: java.lang.ClassCastException: com.<...skipped...>.BusinessPayloadData cannot be cast to org.springframework.messaging.Message

僅限於此定義爲我的作品

IntegrationFlows.from(inputChannel()) 
    .filter(new MessageSelector(){ 
     @Override 
     public boolean accept(Message<?>message){ 
      return ...; 
     } 
    }) 
    .transform(...) 
    .channel(outputChannel()) 
    .get(); 

是否可以通過lambda表達式創建MessageSelector實例?

+0

您假設Lambda的類型與匿名類相同,但它可能不是您的想法。當我遇到這樣的問題時,我經常使用的一種技術是使用我的IDE的重構工具將lambda提取到單獨的變量中,並查看變量聲明中分配給它的類型。如果它與我所期望的不同,我修改該類型,然後使用IDE的重構工具將lambda內聯到原始表達式中。我發現它會填充我不知道添加的類型轉換和其他泛型類型分類器。 –

+0

@HankD當然。我也喜歡你說。但是,這是更具體的'filter'實現的更復雜的情況。 –

回答

4

像這樣:

.filter(Message.class, m -> m.getHeaders().get(...)...) 

還有一個重載的方法來推斷所述目標方法調用的對象類型。

請參閱LambdaMessageProcessor源代碼。由於我們無法直接從Lambda中推斷參數類型Java: get actual type of generic method with lambda parameter,因此我們必須使用另一個頂級類型參數來執行此操作。

否則它只會像Object一樣結束,目標方法調用將其視爲​​的類型。