【问题标题】:Autowired problem with a beanbean 的自动装配问题
【发布时间】:2011-07-19 13:36:09
【问题描述】:

使用弹簧 2.5,

我有一个类 StockDwr

StockDwr 它是一个具有原型作用域的 bean 名称股票

在这个类中,我有一个带有 @Autowired 注释的属性 ModRepository

ModRepository 仅供此类使用

在这堂课中我只有那个(因为我试图找到问题)

public void read(String fileName) {
    System.out.println(fileName);
}

当我去使用股票的jsp时,我得到了

创建名为“stock”的 bean 时出错:字段自动装配失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 com.domain.ModRepository com.web.StockDwr.modRepository;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义类型 [com.domain.ModRepository] ​​的唯一 bean:未满足类型 [com.domain.ModRepository] ​​的依赖项:预计至少有 1 个匹配 bean

我没有在 xml 文件中定义 ModRepository,我试图这样做,但它得到了同样的问题

有什么想法吗?

【问题讨论】:

  • 您是如何尝试准确定义 ModRepository 的?

标签: java spring annotations dwr


【解决方案1】:

可能你在 xml 文件中为 ModRepository 做了不正确的 bean 定义。 spring 无法找到 bean com.domain.ModRepository

自动装配按类型发生。您的 ModRepository 是某个接口的实现吗?在这种情况下,如果有很多实现,spring 将无法唯一识别一个 bean。

为了避免这种情况,请使用 @Qualifier 注释。限定符确保自动装配按名称发生。

或者,您可以尝试使用注释,将 @Component 放在 ModRepository 类的顶部 并确保您的 applicationContext.xml 中有这两行

  <context:annotation-config />
  <context:component-scan base-package="com.domain" />

【讨论】:

  • 与@Component 一起工作,但我不明白为什么我需要把这个annonation。我尝试添加其他bean(没有@Component)并且工作......所以现在真的不是ModRepository的问题
  • 可能你需要一个 @qualifier 注解来自动装配 byName 而不是 byType
  • 我尝试使用和不使用 ModRepository 接口,同样的事情......我在我的 StockDwr 中的 ModRepository 属性上尝试了限定符注释,但如果我不放置组件注释,我会得到同样的错误......
  • 你在放Qualifier注解的时候,是不是也在xml映射中定义了qualifier?
【解决方案2】:

您收到错误是因为 spring 不知道您的 ModRepository 对象。为了自动装配某些东西,spring 必须知道那个东西是什么。您说您尝试在应用程序上下文 xml 中定义 ModRepository,但仍然遇到相同的错误。在这种情况下,您一定是错误地定义了它,因为这正是您必须做的。

【讨论】:

  • 习惯如果放Autowired,就不需要在xml文件中定义了。我在xml文件中添加:
  • “习惯如果你放 Autowired,你不需要在 xml 文件中定义它”——这并不完全正确。您总是必须定义 ModRepository bean 本身,或者像您指出的那样在 XML 中定义,或者通过使用 (at)Service、(at)Component 等注释您的 ModRepository 实现。
【解决方案3】:

我假设你配置了

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

没有@Component 注解,Spring 无法知道哪个类是它应该跟踪的组件。

【讨论】:

    【解决方案4】:

    @Autowired 使用注解

    @Repository("ExampleDao") 公共类 ExampleDaoImpl 实现 ExampleDao

    @Service("ServiceExample") 公共类 ExampleServiceImpl 实现 ExampleService

    @Controller 公共类 ExampleController

    @Autowired private ExmpleService ServiceExample;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      相关资源
      最近更新 更多