0

jar を使用しているプロジェクト A がありますB.jar(ここで、B はプロジェクト A の依存関係として使用される別のプロジェクトです)、マップに必要なすべてのデータを保持するBean(一種のキャッシュ) があります。Spring-gemfireこのマップ Bean はプロジェクト (jar私のプロジェクトに含まれている) によって使用されています。つまり、B はキャッシュ プロパティを読み取りますが、これを行うことができません。

プロジェクトBの私のwebapp-config.xml

    <!-- Injecting bean in our A application -->
    <bean id="foo" class="com.abc.solutions.Foo" init-method="loadFoo">
             <property name="bar1" ref="gemFireBean"/>
             <property name="bar2" ref="commonBean"/>
    </bean>

    <bean id="b2" class="java.util.HashMap"
       factory-bean="foo" factory-method="createB2" autowire="byName">
    </bean>

上記の Bean b2 は、外部プロジェクト B (私のプロジェクト A に jar として含まれています) で使用する必要があります。

クラスシンプロジェクトB2の一部

@Autowired
    @Qualifier("b2")
    private Map<String, String> mapFromA;

しかし、私は得ています

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency

どんな助けでも大歓迎です。

4

2 に答える 2

0

それ自体がコレクションまたはマップ タイプとして定義されている Bean は@Autowired、タイプ マッチングが適切に適用されないため、 を介して注入できません。このような Bean に使用@Resourceし、特定のコレクションまたはマップ Bean を一意の名前で参照します。

refer : beans-property-is-not-setting-from-utillist-object

と春のドキュメント

于 2016-08-04T12:19:24.423 に答える
0

簡単な答え: a HashMap(または配列やコレクションなどの他の一般的なコンテナー) は決して Spring Bean であってはなりません。インフラストラクチャ コンテナーではなく、ビジネス オブジェクトのみを Bean にする必要があります。

マップの周りにカスタム オブジェクトを作成し、これを注入することで、これを回避できます。あなたの場合、fooBean を注入し、そこからプログラムでマップを取得する必要があります。


あなたの場合に何が起こるかは、マニュアル@Autowiredセクションの概要です:

予想されるキーの型が文字列である限り、型指定されたマップもオートワイヤーできます。Map 値には、予想されるタイプのすべての Bean が含まれ、キーには対応する Bean 名が含まれます。

public class MovieRecommender {

    private Map<String, MovieCatalog> movieCatalogs;

    @Autowired
    public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
        this.movieCatalogs = movieCatalogs;
    }

    // ...

}

つまり、Spring は、キーが Bean 名で、値が文字列型の Bean であるマップが必要だと考えます。

于 2016-08-04T13:35:49.020 に答える