【问题标题】:Unable to inject array list as dependency无法将数组列表作为依赖项注入
【发布时间】:2013-05-28 05:13:44
【问题描述】:

我正在创建一个带有注释的 bean。

@Component
public class MyClass
{

    @Autowired
    private ArrayList<String> myFriends= new ArrayList<String>();

   //Getters and setters  

}

我收到以下异常

无法自动装配字段:private java.util.ArrayList com.mypackage.MyClass.myFriends;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [java.util.ArrayList] 的匹配 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

我也试过这个

@Resource
    private ArrayList<String> myFriends= new ArrayList<String>();

我收到以下异常

没有为依赖项找到类型为 [java.util.ArrayList] 的匹配 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, authenticationType=CONTAINER)}

请告诉我如何解决这个问题。

【问题讨论】:

  • 你明白你在做什么,对吧?
  • @LuiggiMendoza。我正在尝试创建一个属性为 List 的 bean
  • 您希望注射什么?
  • 不,您正在尝试创建一个 bean 并从无处注入一个 ArrayList。您应该将对象实例作为接口实现者注入,而不是 ListMap 对象。此外,异常消息非常清楚:没有为依赖项找到类型为 [java.util.ArrayList] 的匹配 bean 并且 预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者 i>.
  • @LuiggiMendoza。当我删除 Autowired 注释时,我收到异常,因为在类中找不到方法。

标签: java spring


【解决方案1】:

您需要在 XML 文件中定义一个列表。

在 XML 文件中包含 util 命名空间并添加以下 bean 定义。

<util:list id="myFriends">
 <value>string1</value>
 <value>string2</value>
 <value>string3</value>
</util:list>

您需要将变量的类型更改为List&lt;String&gt; 而不是ArrayList&lt;String&gt;。这将使注入变得更容易,并且也是一种更好的编码实践。您需要添加 Qualifier 注解来指定需要注入的 bean 的 id,如果您只有一个这样的列表,则可能不需要 qualifier。

@Component
public class MyClass {
    @Autowired
    @Qualifier("myFriends")
    private List<String> myFriends= new ArrayList<String>();
    //Getters and setters
}

util:list 的 spring 参考文档链接 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html#xsd-config-body-schemas-util-list

【讨论】:

  • 虽然你有一个观点,但这确实不是@Autowired 在现实世界中的用法。请注意,即使在注入列表时,您也会为其分配一个新值 =\.
  • util:list 就是为此目的而创建的。在某些情况下,我可能需要注入 vlaues 列表(例如服务器 ips 列表)。此外,始终将任何列表引用初始化为空列表也是一个好习惯。这样,如果对象在非 spring 上下文中使用(例如单元测试),它将正常工作,而不是抛出空指针异常(NullObject 模式)。
  • 如果你已经在使用 Spring,你可以(我打赌你会)使用 SpringJUnit4ClassRunner 来获得 Spring 的所有功能。 IMO,我会将值列表放在不同的属性文件中,而不是在 spring.xml 中用于分发目的。以您的示例为例,我将有一个用于开发阶段的服务器 ips 列表和一个用于 qa 和生产阶段的完全不同的服务器 ips 列表,因此我宁愿拥有 3 个具有正确配置文件的不同配置环境,而不是 3 个 spring.xml 配置文件以及它们各自的值:)。
  • 对于单元测试,最好不要使用 spring - mock / stub 依赖项。 SpringJUnit4ClassRunner 用于集成测试。此外,对于 3.2 配置文件,您可以在多个配置文件(测试、qa、产品)中定义具有相同 id 的 bean,然后在运行时选择一个。我并不是建议在任何地方都应该使用它,但它是一个有效的选项。
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2017-12-11
相关资源
最近更新 更多