Недоступен квалифицируемый компонент типа: ожидается как минимум 1 компонент, который считается кандидатом AutoWire. - PullRequest
0 голосов
/ 18 мая 2018

У меня есть настройки конфигурации 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)}

Я определяю @Repository в UserDaoImpl и @Serice в UserServiceImpl, и я также выполняю сканирование компонентов, как этот @ComponentScan ("com.fyt.fyt ")" com.fyt.fyt "- это пакет корневого уровня, но я получаю эту ошибку.Что я делаю не так?

1 Ответ

0 голосов
/ 18 мая 2018
  • Решение 1: переименуйте метод getUserDao() должно быть userDao().
  • Решение 2: Измените квалификатор в HomeController на @Qualifier(value=getUserDao)
  • Решение 3: Удалитеквалификатор (предполагается, что в вашем приложении только 1 UserDao)

Имя метода, помеченное @Bean, становится именем компонента.Таким образом, в настоящее время имя компонента - "getUserDao", а вы пытаетесь автоматически связать компонент с именем "userDao" в вашем HomeController

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...