【问题标题】:Why @Autowired not work out side a controller class spring mvc?为什么@Autowired 在控制器类 spring mvc 中不起作用?
【发布时间】:2015-02-19 11:10:05
【问题描述】:

我有一个 Spring MVC 项目。我有一个类控制器、服务和 dao 层。

@Controller
public class HomeController {

    @Autowired
    private PersonFacade personFacade;
   ....
}

我有我的服务类

@Service
@Transactional
public class PersonFacadeImpl implements PersonFacade{

    @Autowired
    private PersonDAO personDAOdef;

    //code ....
}

最后是我的 DAO 类

@Repository
public class PersonDAOImpl implements PersonDAO{
    @Autowired
    private SessionFactory sessionFactory;
     //code
}

这很好用,我的问题就在这里:

我做了一个类监听器,我想将 PersonFacade 与 @Autowired 一起使用

public class PersonListener extends AbstractRepositoryEventListener<Person> {

    @Autowired
    private PersonFacade personFacade;
    .... //code 
}

我有这个例外:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name      
'personListener': Injection of autowired dependencies failed; nested exception is      
org.springframework.beans.factory.BeanCreationException: Could not autowire field:   
private com.gabrielglez.main.Facade.PersonFacade 
com.gabrielglez.main.evenlistener.PersonListener.personFacade; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of 
type [com.gabrielglez.main.Facade.PersonFacade] found for dependency: expected at least 1 
bean which qualifies as autowire candidate for this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)}

我在其他包中有这个类,我不知道为什么在这个类中 Spring 无法创建对象并且控制器内部工作正常。

我不知道发生了什么。

这是我的 servlet 上下文:https://github.com/tsw1985/HelloHibernate/blob/master/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml

简而言之,如果我想在控制器类之外注入一个带有 @Autowired 的依赖项,我也会遇到同样的问题。谢谢大家。

如果你帮助我,你会救我的命,因为我有一个星期的时间来解决这个问题。

谢谢大家!!

【问题讨论】:

  • 你用的是什么版本的 Spring?
  • 你如何创建接口,将你的类实现到制作的接口,然后自动装配接口。

标签: java spring-mvc exception autowired


【解决方案1】:

@Autowired 仅适用于 Spring 管理的对象。因此,例如使用 @Component 注释您的类 PersonListener 并且不要将实例创建为 new Object()。例如使用@Autowired 来获取实例。

【讨论】:

  • Himjames ,也许我不能很好地解释我的问题。问题是:我想在我的 LISTENER 中注入我的 PersonFacade 类,因为在监听器中我想用它做事。问题是当我想在 CLASS Listener 中注入该对象时,我有一个异常,但是在 Controller 中我可以始终使用带有 @Autowired 的 PersonFacade ,但是如果我想在其他不是 Controller 的类中使用该类,我有这个问题。我需要在servelet-context.xml 中添加一些东西???我对此感到沮丧。
  • 我明白你的意思。我试图向您解释,您的 Controller 由 Spring 管理,因为它带有 @Controller 注释。但是您的 Listener 没有注释,也不是由 Spring 管理的。很容易解释:您只能在注入的对象中注入对象。而且你的监听器没有被注入。
  • Himjames,最后我在我的监听器类中放了一个@Component,我也遇到了同样的问题。我不知道发生了什么。我总是有同样的例外。你知道一些例子吗?
  • 我不知道你在哪里以及如何使用 PersonListener。你如何创建这个类的实例?
  • 我将它与 lightadmin 监听器一起使用,您可以在 lightadming.org 的监听器部分中看到它。我不做这个类的一个实例。我有一个方法,onBeforeDelete(),这个方法在我删除一行时执行。但是如果没有侦听器,例如,如果我做了一个不是控制器的简单类,并且我想注入一个由服务注释的类,使用自动装配总是我有那个异常。即使我做了@component并且我有那个例外,它不可能在控制器注释类之外使用自动装配?我想看一个例子,你可以下载我的项目并尝试一下吗?
【解决方案2】:

您正在对包使用组件扫描,但该组件不会自动添加为托管 bean,因为它没有 bean 处理器正在寻找的任何注释:

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

component-scanspring-context.xsd 文档说明了这一点(强调我的)。

扫描类路径以查找将被注释的组件 自动注册为 Spring bean。 默认情况下,Spring 提供 @Component、@Repository、@Service 和 @Controller 构造型将是 注意:这个标签暗示了 'annotation-config' 标签,激活@Required,@Autowired, @PostConstruct、@PreDestroy、@Resource、@PersistenceContext 和 组件类中的@PersistenceUnit 注解,即 通常需要自动检测组件(无需外部 配置)。关闭“annotation-config”属性以 停用此默认行为,例如为了使用自定义 用于处理这些注释的 BeanPostProcessor 定义。笔记: 您可以在包路径中使用占位符,但只能针对 系统属性(类似于资源路径)。组件扫描 导致新的 bean 定义被注册;春天的 PropertyPlaceholderConfigurer 将应用于那些 bean 定义 就像常规 bean 定义一样,但它不适用于 组件扫描设置本身。请参阅 javadoc org.springframework.context.annotation.ComponentScan 获取信息 关于引导组件扫描的基于代码的替代方案

【讨论】:

  • 好的,我该如何解决这个问题?谢谢。注释是什么??
  • 这是我加粗的任何注释。查看您的其他类,它在要扫描的类级别上应用了@Service 注释。您需要在您的课程中添加任何这些注释,然后您的 component-scan 会选择它,例如 @Component
猜你喜欢
  • 2013-12-11
  • 2022-08-04
  • 2017-05-13
  • 1970-01-01
  • 2016-08-21
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多