java - 没有可用类型的合格 bean : expected at least 1 bean which qualifies as autowire candidate

标签 java spring hibernate spring-mvc

我有这样的 Hibernate 配置设置

    @Configuration
@PropertySource("classpath:db.properties")
@ComponentScan("com.fyt.fyt")
@EnableTransactionManagement
public class ApplicationContextConfig {

    @Autowired
    private Environment env;

    @Bean()
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        internalResourceViewResolver.setPrefix("/WEB-INF/views/");
        internalResourceViewResolver.setSuffix(".jsp");
        return internalResourceViewResolver;
    }

    @Bean()
    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("db.driver"));
        dataSource.setUrl(env.getProperty("db.url"));
        dataSource.setUsername(env.getProperty("db.username"));
        dataSource.setPassword(env.getProperty("db.password"));
        return dataSource;
    }

    @Autowired
    @Bean()
    public LocalSessionFactoryBean getSessionFactory() {

        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
        factoryBean.setDataSource(getDataSource());

        Properties props = new Properties();
        props.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
        props.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));

        factoryBean.setHibernateProperties(props);
        factoryBean.setAnnotatedClasses(User.class);
        return factoryBean;

    }
    @Autowired
    @Bean()
    public HibernateTransactionManager getTransactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(getSessionFactory().getObject());
        return transactionManager;
    }

    @Autowired
    @Bean()
    public UserDao getUserDao(SessionFactory sessionFactory) {
        return new UserDaoImpl(sessionFactory);
    }
}

我有这样的 UserServiceImpl.java

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserDao userDao;

    @Transactional
    @Override
    public List<User> list() {

        return userDao.list();
    }

    @Transactional
    @Override
    public User getUser(int id) {

        return userDao.getUser(id);
    }

    @Transactional
    @Override
    public void saveOrUpdate(User user) {
        userDao.saveOrUpdate(user);

    }

    @Transactional
    @Override
    public void delete(int id) {
        userDao.delete(id);

    }

}

像这样的 UserDaoImpl.java

@Repository
public class UserDaoImpl implements UserDao{
    @Autowired
    private SessionFactory sessionFactory;

    public UserDaoImpl() {

    }

    public UserDaoImpl(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public List<User> list() {
        List<User> users = (List<User>)sessionFactory.getCurrentSession().createCriteria(User.class)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
        return users;
    }

    @Override
    public User getUser(int id) {
        String hql = "from tbl_user where id="+id;
        Query query = sessionFactory.getCurrentSession().createQuery(hql);
        List<User> users = (List<User>)query.list();
        if(!users.isEmpty() && users != null) {
        return users.get(0);
        }
        return null;
    }

    @Override
    public void saveOrUpdate(User user) {
        sessionFactory.getCurrentSession().saveOrUpdate(user);

    }

    @Override
    public void delete(int id) {
        User usertodelete = new User();
        usertodelete.setId(id);
        sessionFactory.getCurrentSession().delete(usertodelete);
    }

}

当我运行它时,我得到了这个异常

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'homeController': Unsatisfied dependency expressed through field 'userDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.fyt.fyt.daos.UserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=userDao)}

我在 UserDaoImpl 中定义了@Repository,在 UserServiceImpl 中定义了@Serice,我也在像这样进行组件扫描 @ComponentScan("com.fyt.fyt") “com.fyt.fyt”是根级包,但仍然,我收到此错误。我做错了什么?

最佳答案

  • 解决方案 1:重命名方法 getUserDao() 必须是 userDao()
  • 解决方案 2:将 HomeController 中的限定符更改为 @Qualifier(value=getUserDao)
  • 解决方案 3:删除限定符(预计只有 1 UserDao 在您的应用中)

@Bean 注释的方法的名称成为bean 的名称。所以当前 bean 名称是“getUserDao”,而你正试图在你的 HomeController 中 Autowiring 一个名为“userDao”的 bean

关于java - 没有可用类型的合格 bean : expected at least 1 bean which qualifies as autowire candidate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50407947/

相关文章:

java - Mahout:CSV 到 vector 并运行程序

java - 在 Hibernate 中多次获取父类

java - Spring MVC - 无法读取候选组件类

java - JLabel 文本在透明背景上被覆盖

java - 使用蜡染缩放 SVG?

spring - 为什么 application.properties 中的属性在 Spring Boot 应用程序的 Junit 测试中不可用?

java - hibernate 内存堆不足错误

MySQL/JDBC/Hibernate 第 19 列中的 DATE '91' 格式错误

sql - 在启动时导入 PostgreSQL 触发器。 hibernate

java - 并行包中的两个 Java 类