簡體   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