簡體   English   中英

Spring Boot Camel - Camel 組件中的自動裝配問題

[英]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 組件有些可疑。

我解決這個問題有點快(我兩天前就想發布這個了^^),但一位同事想出了可能是什么問題。

當使用CamelAutoConfigurationInflightRepository 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM