【问题标题】:Issue getting Bean into a Controller in Spring MVC在 Spring MVC 中将 Bean 放入控制器的问题
【发布时间】:2014-10-14 21:57:35
【问题描述】:

在 Spring MVC 中,我有这个 models.UserDAO 类:

@Repository
@Transactional
public class UserDAO implements UserDetailsService {

  @Autowired
  private SessionFactory _sessionFactory;

  private Session getSession() {
    return _sessionFactory.getCurrentSession();
  }

  public void save(User user) {
    getSession().save(user);
    return;
  }

  public User getById(long id) {
    return (User) getSession().load(User.class, id);
  }

  @Override
  public UserDetails loadUserByUsername(String username)
      throws UsernameNotFoundException {

    // implementation 
    // ...
  }

} // class UserDAO

还有这个controllers.UserController 类:

@Controller
public class UserController {

  @Autowired
  private ApplicationContext _appContext;

  @RequestMapping(value="/users/create")
  @ResponseBody
  public String create(@RequestBody User user) {
    // ...

    UserDAO userDao = _appContext.getBean(UserDAO.class);
    userDao.save(user);

    // ...
  }

} // class UserController

到目前为止一切正常:用户已通过 UserDAO 保存方法正确保存在数据库中。

现在我实现了另一个控制器controllers.MainController

@Controller
public class MainController {

  @Autowired
  private ApplicationContext _appContext;

  @RequestMapping(value="/user")
  public String profile()
    // ...

    UserDAO userDao = _appContext.getBean(UserDAO.class);

    // ...
  }

} // class MainController

在后一个控制器中,我在获取 Bean 时出错:No qualifying bean of type [myproject.models.UserDAO] is defined

可能是我获取 bean 的方式错误?:

_appContext.getBean(UserDAO.class);

编辑

我试图在我的 JavaConfig 中添加这个:

@Bean
public UserDAO userDao(){
  return new UserDAO();
}

我用 UserDAO 注入替换了 ApplicationContext _appContext autowired:

@Autowired
private UserDAO userDao;

但现在我收到此错误:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mainController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private myproject.models.UserDAO myproject.controllers.MainController.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [myproject.models.UserDAO] 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)}

【问题讨论】:

标签: java spring spring-mvc controller dao


【解决方案1】:
  1. 您是否在 beans.xml 中设置了 UserDAO 类(或等效的 JavaConfig 类取决于您在应用程序中使用的类)?

  2. 为什么不将 UserDAO 实例本身注入控制器?在我看来,您目前正在应用服务定位器(反)模式。

【讨论】:

  • 您可以在这里找到更多信息:stackoverflow.com/questions/812415/…
  • 在我尝试您的建议的第一篇文章中查看我的编辑。
  • @andre 我希望包扫描没问题,两个控制器都在同一个包中
  • @ankur-singhal 谢谢,我如何检查包裹扫描是否正常?
  • 我正在使用 Spring Boot 和 JavaConfig(所以我没有 context.xml 文件)
猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 2012-11-20
  • 2017-07-26
  • 2015-01-06
  • 2020-03-27
  • 2010-12-30
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多