繁体   English   中英

没有可用类型的合格Bean:预计至少有1个合格为自动装配候选的Bean

[英]No qualifying bean of type available: expected at least 1 bean which qualifies as autowire candidate

我有一个像这样的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的名称。 因此,当您尝试在HomeController中自动将名称为“ userDao”的bean连线时,该bean的名称为“ getUserDao”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM