私は以下を取得しています:
2013-03-27 18:51:54,944 ERROR pringframework.web.context.ContextLoader: 227 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'exporter' defined in URL ... Cannot resolve reference to bean 'dynamicNamingStrategy' while setting bean property 'namingStrategy'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dynamicNamingStrategy' is defined
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at
また、STSは不平を言っています:
Multiple annotations found at this line:
- Referenced bean 'dynamicNamingStrategy'
not found
次の Spring コンテキストのセットアップを使用します。
プロジェクトには、次の (抜粋) を持つ jmx 管理コンテキスト (core-app-web-common-management-context.xml) があります。
<context:annotation-config />
<context:component-scan
base-package="com.a.b.c.management.*" />
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
lazy-init="false">
<property name="autodetect" value="true"></property>
<property name="namingStrategy" ref="dynamicNamingStrategy"/>
ここで、dynamicNamingStrategy は別のプロジェクトで定義され (そして別の jar にパッケージ化され)、次のように上記のコンポーネント スキャンで参照されます。
package com.a.b.c.management;
@Component("dynamicNamingStrategy")
public class DynamicNamingStrategy extends KeyNamingStrategy {
......
上記の Spring コンテキストは、同じプロジェクトにあるメイン コンテキストにインポートされます。
<import resource="classpath*:/META-INF/spring/core-app-web-common-management-context.xml"/>
そのため、どういうわけか DynamicNamingStrategy の @Component スキャンが機能していません...
代わりに、このプロパティ定義をエクスポーターで使用すると、機能します。
<property name="namingStrategy"><bean class="com.a.b.c.management.DynamicNamingStrategy" /></property>
しかし、最初のインスタンスでコンポーネント スキャン メカニズムが失敗する理由を理解したいと思います。どうやら何かが足りないようです。
また、STS の Spring Explorer ビューにもその Bean がありません。構成ファイルオプションの要素のサポートを有効にしても、違いはないようです。