0

org.springframework.beans.factory.annotation.Valueを介してプロパティが注入されるいくつかのクラスを持つライブラリ プロジェクト (Spring 3.0) に依存する、接続しようとしている Spring 3.0 プロジェクトがあります。

注入されたプロパティを持つクラスをロードする必要も、プロパティを注入する必要もありません。ライブラリ プロジェクトからオートワイヤーされる特定のクラスが 1 つだけ必要です。

次の例外が発生し続けます。

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>

回答の1つで提案されているように、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 {
4

2 に答える 2

1

そのライブラリから単一のコンポーネントが必要な場合は、明示的に定義する方がよいでしょう。例えば:

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

... またはJava ベースのコンテナー構成を使用します。

実際にこのパッケージをスキャンする必要がある場合は、考えられるすべてのケースが除外フィルターによって適切に処理されていることを確認してください。スタック トレースは、コンポーネントに @Service ではなく @Controller のアノテーションが付けられていることを示しています。ただし、@Component や @Repository など、考慮すべき他のオプションもあります。

于 2013-03-24T14:03:04.840 に答える
0

私が見落としていた非常に単純な解決策があったことがわかりました。ライブラリ プロジェクトの jar にその applicationContext.xml が含まれていましたが、それを認識していませんでした。私はそれを取り除き、jarファイルを再構築し、適切に動作させました。

于 2013-03-26T20:33:27.593 に答える