当前位置: 首页 > 面试题库 >

使用util模式自动连接列表会产生NoSuchBeanDefinitionException

韶浩博
2023-03-14
问题内容

我有一个要使用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)

令我困惑的是,我认为这将是预期的工作方式。


问题答案:

这是由于3.11.2中指定的@Autowired行为的一个相当模糊的部分。@Autowired:

ApplicationContext通过将注释添加到需要该类型数组的字段或方法中,还可以提供中特定类型的所有bean 。

同样适用于类型化集合…

换句话说,通过说@Autowired @Qualifier("myList") List<String>,您实际上是在要求“给我java.lang.String具有限定符“ myList” 的所有类型的bean的列表。

该解决方案在3.11.3中提到。使用限定符微调基于注释的自动装配:

如果您打算通过名称表示注释驱动的注入,则不要主要使用@Autowired-即使从技术上讲,它可以通过@Qualifier
值来引用Bean名称。取而代之的是,首选JSR-250 @Resource
批注,该批注在语义上定义为通过其唯一名称标识特定目标组件,而声明的类型与匹配过程无关。

由于这种语义差异的特定结果,本身不能定义为集合或映射类型的bean无法注入,@Autowired因为类型匹配不适用于它们。使用
@Resource的唯一名称等豆类,指的是特定集合/图豆。

因此,在测试中使用它,即可正常工作:

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


 类似资料:
  • 问题内容: 可以与列表一起使用吗? 就像我有带有mimetypes的属性文件,而在我的班级文件中,我有类似的东西 问题答案: Spring 4支持自动收集给定类型的所有bean并将其注入到集合或数组中的能力。 例:

  • 我正在开发一个java应用程序,使用过程将信息保存在数据库中。我会举个例子来证明我的怀疑,因为我有点迷路了! 让我们假装我有两个不同的班级 我想把信息保存在数据库中。由于Dur1有3秒,代码PK=1,所以我将有3个插入秒,其中FK=1=Dur的PK 我的问题是,假设(在java中)我知道seg和Dur之间的所有匹配(我有连接它们的列表),我如何使用一个过程,自动地在三个seg插入中放置一个FK /

  • 我的服务等级代码如下: 我的测试课程如下: 在运行测试时,我在给出Mockito的那一行得到了NullPointerException。何时返回条件。我尝试了很多组合,但它仍然提供NPE。我甚至连方法调用都做不到。你能告诉我哪里出了问题吗?

  • 问题内容: 我已经定义了一个接口及其一些实现,并且都用进行了注释。 然后,我通过以下方式将它们自动连接到我的应用中: 工人被列入列表的顺序取决于什么? 我怎样才能让更多的和(也实现)不带注释通过我被装配到同一个列表? 是否保留了xml 的顺序和xml 的顺序? 我是否可以依靠规则将工作人员A,B,C和D放入列表的顺序? 问题答案: 如果要在Spring注入的List中对这些依赖项进行排序,请使用@

  • 问题内容: 我试图在我的机器上安装Kibana 4,但出现以下错误。 问题答案: 该告诉你,它不能连接到Elasticsearch。该告诉你什么它试图连接到。 您需要修改和更改设置以指向您的集群。如果您在同一框上运行Elasticsearch,则正确值为。

  • 本文向大家介绍python列表生成式与列表生成器的使用,包括了python列表生成式与列表生成器的使用的使用技巧和注意事项,需要的朋友参考一下 列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,就会占用过多的内存空间,可能会导致MemoryError内存错误或者导致程序在运行时出现卡顿的情况 列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如