[英]Spring Boot Camel - Autowiring issues in Camel components
我正在使用 Spring Boot 1.5.7 和 Apache Camel 2.19.3,使用spring-boot-starter-camel提供的 Spring Boot AutoConfiguration
它是非常基本的 Spring Boot 和 Camel 初始化,如他們的教程,所以我們有一個RouteBuilder組件可以做到這一點。
@Component
public class CIFRoutes extends RouteBuilder {
@Override
public void configure() throws Exception {
// build routes
}
}
我們有一個配置,它定義了我們應用程序中需要的一些 bean
@Configuration
public class MyConfiguration {
@Bean
public void Map<String, Object> map() {
return new HashMap<>()
}
}
最后,我們有一個自定義的InflightRepository實現,它應該被自動配置掃描並添加到CamelContext 中,它基本上可以工作,但是由於某種原因,組件沒有正確初始化。 意思是,它的依賴項沒有初始化,但是 bean 被實例化並注入到我的應用程序中。
@Component
public class MyCustomInflightRepository extends DefaultInflightRepository {
@Autowired
private Map<String, Object> map;
@Override
public void add(Exchange exchange) {
super.addExchange(exchange);
// ....
}
}
現在的問題是map仍然是(null) ,我也嘗試添加一個 @PostConstruct 初始化方法,但它沒有被調用。
就我能夠重建而言,它似乎與CamelAutoConfiguration中的過早有關,其中CamelContext bean 被實例化(在私有方法afterPropertiesSet 中完成。
InflightRepository inflightRepository = getSingleBeanOfType(applicationContext, InflightRepository.class);
if (inflightRepository != null) {
LOG.info("Using custom InflightRepository: {}", inflightRepository);
camelContext.setInflightRepository(inflightRepository);
}
如果MyCustomInflightRepository未實現InflightRepository ,則 bean 已正確初始化,但 Camel 確實無法識別。 禁用自動配置時,注入 bean 的依賴項。
所以,要么我按照 Spring 標准做不可能的事情,要么 Spring 的 Camel 組件有些可疑。
我解決這個問題有點快(我兩天前就想發布這個了^^),但一位同事想出了可能是什么問題。
當使用CamelAutoConfiguration的InflightRepository bean(或實際上 Camel 試圖在此處獲取匹配 bean 的所有內容)時,在屬性解析器完全初始化之前訪問上下文,這導致 bean 在任何自動連接之前被初始化(並緩存在上下文中)屬性可以解決。
我不是 Spring 專家,但在我看來,這種行為有點問題,因為當您將 Spring DI 用於自定義組件時,未初始化的 bean 會被拉入CamelContext 。
可以肯定的是,我會向維護者提出這個問題......
順便說一句,我的簡單解決方案是在上下文配置中手動設置飛行中的存儲庫(如建議的那樣)
@Bean
public CamelContextConfiguration camelConfig() {
return new CamelContextConfiguration() {
@Override
public void beforeApplicationStart(CamelContext context) {
context.setInflightRepository(new MyCustomInflightRepository(/* Dependencies go here */ ));
}
@Override
public void afterApplicationStart(CamelContext camelContext) {
}
};
}
此外,在不推薦的項目中使用camel-http-starter似乎也是一個問題,他們聲稱它已被棄用。
因此,要么不要為您的駱駝管理的 bean 執行 DI(無論是通過屬性還是構造函數注入),要么跳過該啟動程序。
問題是Map<String,Object>
太模糊,Spring 無法理解您想要什么; 我認為默認行為是它會為您提供按名稱鍵入的所有 bean。
相反,更具體,或者可能提供必要的參數作為構造函數參數並在@Bean
方法中顯式配置它們(無論如何總是使用構造函數注入是個好主意)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.