2017-10-16 56 views
0

我有以下上下文配置:如何檢查爲什麼Camel中的@BeanInject不會初始化成員?

<bean id="propertiesFactory" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="locations"> 
    <list> 
     <value>classpath:conf.properties</value> 
    </list> 
    </property> 
</bean> 

<bean id="bridgePropertyPlaceholder" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer"> 
    <property name="properties" ref="propertiesFactory"/> 
</bean> 

<bean id="messageThrottlerHolder" class="foo.bar.common.MessageThrottlerHolder"/> 
<bean id="cassandraRoute" class="foo.bar.routes.CassandraRouteBuilder"/> 

然後,在這兩個類:MessageThrottlerHolderCassandraRouteBuilder有:

@BeanInject 
Properties properties; 

奇妙。

但是CassandraRouteBuilder可能/可以使用properties沒有NPE,因爲properties已經很好的初始化了。 在另一方面MessageThrottlerHolder不能使用properties作爲構造properties,有沒有辦法對它們進行初始化。

如何檢查爲什麼properties爲空? 什麼可能是錯的,那@BeanInject莫名其妙地不初始properties

回答

2

如果您認爲Properties以某種方式Camel屬性佔位符或類似的東西,那麼這樣做是錯誤的。

駱駝的@BeanInject是用於通過bean名稱/ id在Camel寄存器中查找Bean,作爲貧民的Spring IoC。如果你使用的是Spring,那麼你可以使用Spring @Autowired或者其他的東西。

如果您要訪問從屬性的屬性佔位符,那麼你可以注入CamelContext和使用其API解決:http://static.javadoc.io/org.apache.camel/camel-core/2.20.0/org/apache/camel/CamelContext.html#resolvePropertyPlaceholders-java.lang.String-

或者使用駱駝的@PropertyInject,而不是在您指定的鍵名來查找。我不確定Spring是否有類似的註釋來查找屬性,因爲你已經打開了駱駝大橋。你也可以試着去研究一下。

+0

我知道我做錯了什麼:-)。但是如何檢查什麼是錯的? 現在我有:'@Inject 私人CamelContext上下文; @PropertyInject(「processing.throughput」) private String kafkaThroughput; @BeanInject(「properties」) 私有屬性的屬性;'在我的bean中,仍然在調試器中我看到所有這些字段都設置爲*** null ***當我到達構造函數時。所以有一個非常基本的問題。 –

+1

這些字段是在構造函數 –

+0

後注入的。與此同時,我發現它也是我自己:-)。 我將所有可能的日誌切換到TRACE級別。然後我看到參數注入發生在構造函數被調用後。 爲了解決這個問題,我讓構造函數爲空,並將使用給定參數啓動實例的任何功能移動到* init *方法中。在Camel環境中,我將對象實例化分爲兩部分:1.參數化和2. init *完成的初始化。 感謝您的靈感。 –

相關問題