1

私は以下を取得しています:

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 がありません。構成ファイルオプションの要素のサポートを有効にしても、違いはないようです。

4

1 に答える 1

2

elements属性.*のパッケージ名の末尾に をドロップします。これにより、コンポーネントスキャンが という名前のパッケージを探していると思いますが、おそらく存在しません (存在することはできません)。<context:component-scan>base-package*

base-package はまさにそれ、base パッケージです。component-scanはすべての基本パッケージのすべての子をスキャンするため、パッケージ名の末尾にワイルドカードを付ける必要はありません.*

于 2013-04-04T13:47:13.350 に答える