2013-03-22 194 views
0

我有一個春天3.0項目,我試圖連線,有一個庫項目(也是春天3.0)的依賴項有幾個類的屬性被注入通過org.springframework.beans.factory .annotation.Value春天自動裝配

我不需要加載注入屬性的類,也不需要注入屬性。我只需要從圖書館項目中自動裝配一個特定的類。

我不斷收到以下異常:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.example.library.controller.App.dir; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'app.achDir' 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282) 
... 38 more 
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'app.achDir' 
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:173) 
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:125) 
    at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer$PlaceholderResolvingStringValueResolver.resolveStringValue(PropertyPlaceholderConfigurer.java:403) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:736) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:713) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474) 
    ... 40 more 

這裏是我的applicationContext.xml的片段。我嘗試了以下幾種版本,但排除/包含過濾器似乎不起作用。

<context:component-scan base-package="com.example.library" > 
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>  
</context:component-scan> 

我正在使用一個PropertyPlaceholderConfigurer,如其中一個答案所示,這已經存在於我的項目中。另外,我從Spring配置文件中刪除了所有的組件掃描和註解配置。

<!-- Define the other the old-fashioned way, with 'ignoreUnresolvablePlaceholders' set to TRUE --> 
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>src/test/resources/my.properties</value> 
      <value>my.properties</value> 
     </list> 
    </property> 
    <property name="ignoreResourceNotFound" value="true"/> 
</bean> 

我要補充一點,出現這種錯誤運行擴展與以下注釋超類單元測試時:

@TransactionConfiguration(defaultRollback = true,transactionManager="txManager") 
@Transactional 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath*:applicationContext.xml") 
public abstract class BaseTest { 
+0

如果你告訴我哪個圖書館可能可以幫忙。錯誤是非常奇怪的 – emd 2013-03-22 22:32:55

+3

可能是更好的選項來聲明你需要的bean而不是掃描 – 2013-03-22 23:02:19

+0

你的配置似乎沒有錯,但也許你失敗的類'com.example.library.controller.App'建議應用程序類用'@ Controller'註釋,而不是'@Service',所以你可能需要在'中改變表達式。'無論如何,我會用一個屬性源來解決這個問題。 「app.achDir」的「不關心」值,因爲你不用它(和bean) – 2013-03-22 23:40:31

回答

0

原來有一個非常簡單的解決方案,我忽略了。我的庫項目jar包含它的applicationContext.xml,我沒有意識到它。我刪除了這個,重建了罐子並正常工作。

1

如果您需要從庫中的一個組成部分,那麼它可能會更好明確地定義它。例如:

<bean id="..." class="com.example.library.SomeComponent"> 
<!-- Bean initialization --> 
</bean> 

...或使用Java-based container configuration

如果您確實需要掃描此軟件包,請確保排除過濾器正確處理所有可能的情況。堆棧跟蹤表明,組件使用@Controller註釋,而不是@Service註釋。但是,還有其他選項,應該考慮,比如@Component和@Repository。

+0

問題是,即使當我不做組件掃描,我仍然得到錯誤。 – 2013-03-25 00:51:06

+0

錯誤消息是否完全相同? 1)確保組件不被其他組件掃描(例如,作爲應用程序中的「常規」組件)2)嘗試僅爲該組件設置這些屬性(使用[PropertyPlaceholderConfigurer](http:// static .springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html))並查看是否有任何更改。 – 2013-03-25 06:49:21

+0

是的,完全相同的錯誤。該項目使用PropertyPlaceholderConfigurer。 – 2013-03-25 13:56:26

相關問題