1. ホーム
  2. java

[解決済み] util スキーマを使用した List の自動配線で NoSuchBeanDefinitionException が発生する。

2023-04-01 02:53:07

質問

Spring util 名前空間を使って、名前付きリストで注入したいBeanがあります。 <util:list id="myList"> しかし、Springは代わりにString型のBeanのコレクションを探しています。私の壊れたテストは次のとおりです。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ListInjectionTest {

    @Autowired @Qualifier("myList") private List<String> stringList;

    @Test public void testNotNull() {
        TestCase.assertNotNull("stringList not null", stringList);
    }
}

私のコンテキストは

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:util="http://www.springframework.org/schema/util"
   xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

   <util:list id="myList">
       <value>foo</value>
       <value>bar</value>
   </util:list>

</beans>

しかし、私は

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [java.lang.String] found for dependency [collection of java.lang.String]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=myList)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:726)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:571)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412)

私はこれが期待される動作方法であると考えたので、むしろ私を困惑させています。

どのように解決するのですか?

これは、@Autowired の動作の中でもかなり不明瞭な部分によるもので、以下のように指定されています。 3.11.2. Autowired :

また、すべての ビーンを提供することもできます。 ApplicationContext から提供することもできます。 アノテーションを追加することで、 から特定の型の Bean をすべて提供することもできます。 アノテーションを追加します。

型付きコレクションも同様です...

つまり、次のように言うことで @Autowired @Qualifier("myList") List<String> というのは、実際には java.lang.String という修飾子を持つすべてのビーンのリストを教えてください。

で解決策が述べられています。 3.11.3. 修飾子によるアノテーションベースの自動配線の微調整 :

もしあなたが アノテーション駆動型インジェクションを名前で表現する。 を主に使わないでください。 @Autowired - であっても が技術的に参照可能であっても を通してビーン名を参照することが技術的に可能であっても @Qualifier 値を通してビーン名を参照することが技術的に可能であっても、です。その代わりに、JSR-250の @Resource アノテーションを使用します。 意味的に定義され 特定のターゲットコンポーネントをその 一意な名前で特定のコンポーネントを識別するために意味的に定義されます。 はマッチングプロセスには無関係です。 アノテーションです。

この意味上の違いの具体的な帰結として 意味上の違いとして,ビーンは として定義されているビーンは マップ型として定義されているビーンズは @Autowired を介して注入することはできません。 で注入することはできません。 使用方法 @Resource を使用し,そのようなビーンに対して 特定のコレクション/マップビーンを 一意名で特定のコレクション/マップビーンを参照します。

では、これをテストで使ってみてください、問題なく動作します。

@Resource(name="myList") private List<String> stringList;