当前位置: 首页 > 知识库问答 >
问题:

Spring将列表自动转换到bean中会导致NoSuchBeanDefinitionException

陈琪
2023-03-14

在Spring3.1.3.Release项目中,我希望创建并自动生成一个包含某个服务的枚举的列表。

不幸的是,autowiring失败了(NoSuchBeanDefinitionException),而我可以在上下文中检索bean,并手动连接依赖项。

下面是一个小的测试用例(使用Spring 3.1.3和JUnit),展示了这个问题:

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

    <context:component-scan base-package="junk"/>

    <util:list id="myList" value-type="junk.GreatThings">
        <value>SUPER</value>
        <value>COOL</value>
    </util:list>

</beans>
package junk;
public enum GreatThings {AMAZING, GREAT, SUPER, COOL}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:junkcontext.xml"})  
public class TestAutowiringSupport {
    @Autowired @Qualifier("myList") List<GreatThings> greatThings;

    @Test public void testSuperCool() {
        Assert.assertThat(greatThings, hasItem(SUPER));
        Assert.assertThat(greatThings, hasItem(COOL));
    }
}

这将导致NosuchBeanDefinitionException。我尝试用我的bean id放入@qualifier来帮助Spring执行布线,但没有成功。

如果我使用Spring生命周期回调来取回bean,然后手动连接它,那就很好了。

编译和运行良好的版本:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:junkcontext.xml"})
public class TestAutowiringSupport implements ApplicationContextAware
{

    ApplicationContext ctx;
    List<GreatThings> greatThings;

    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {this.ctx = ctx;}

    @PostConstruct
    public void manualWiring() {greatThings = (List<GreatThings>) ctx.getBean("myList");}

    @Test public void testSuperCool() {
        Assert.assertThat(greatThings, hasItem(SUPER));
        Assert.assertThat(greatThings, hasItem(COOL));
    }

}

在这种情况下autowiring有什么问题?

共有1个答案

贺劲
2023-03-14

正如参考文档中所述,将@autowired注释放置在类型化集合上意味着“查找给定类型的所有bean(greatthings),将它们放在集合中并注入该集合”。之所以出现异常,是因为没有声明greatthings类型的bean。

问题是没有简单的方法将枚举值声明为bean。再说一遍,老实说,我没有看到用例。

 类似资料:
  • 我正在将现有的基于Spring3.1的web应用程序转换为SpringBoot1.2.5。我最初将旧应用程序升级到Spring4.1.7。 在创建bean时,字段将以的形式出现。因此工厂方法(getResourceClasses)抛出。

  • 问题内容: 我有一类具有类型的对象列表。 我的弹簧配置看起来像这样。 现在,可以在列表中自动自动连接所有类型的bean,而不是显式连接列表中的每个守护程序实现。我要解决的问题是,如果有人创建了类的新实现的bean,却忘记将其连接到列表中。 我已经在stackoverflow上的某个地方看到了这个问题,但无法再次找到它。对此表示歉意。 问题答案: 它应该像这样工作(从您的XML中删除ArrayLis

  • 问题内容: 我有一类具有类型的对象列表。 我的spring配置看起来像这样。 现在,可以在列表中自动自动连接所有类型的bean,而不是显式连接列表中的每个守护程序实现。我要解决的问题是,如果有人创建了类的新实现的bean,却忘记将其连接到列表中。 我已经在stackoverflow上的某个地方看到了这个问题,但无法再次找到它。对此表示歉意。 问题答案: 它应该像这样工作(从你的XML中删除Arra

  • 我正试图在Spring将列表转换为页面。我已经用 新的PageImpl(users,pageable,users.size());

  • 问题内容: 我一直在搜索,但找不到这些步骤。 我有一个包含以下内容的属性文件: 我有一个类似的文件,但是在machines元素中具有不同数量的成员,如下所示: 我的问题是如何以一种通用方式将这个可变长度的机器变量加载到我的spring配置中的bean中? 像这样的东西: 机器是我的Java代码中的数组或列表。我可以定义它,但是我想知道如何做到这一点。 基本上,我宁愿让spring进行解析并将每个值