Java 没有可用类型的合格bean:至少需要1个符合autowire候选条件的bean
我有一个像这样的Hibernate配置设置Java 没有可用类型的合格bean:至少需要1个符合autowire候选条件的bean,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我有一个像这样的Hibernate配置设置 @Configuration @PropertySource("classpath:db.properties") @ComponentScan("com.fyt.fyt") @EnableTransactionManagement public class ApplicationContextConfig { @Autowired private Environment env; @Bean() publi
@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);
}
}
@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);
}
}
@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);
}
}
我有这样的userserviceinpl.java
@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);
}
}
@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);
}
}
@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);
}
}
我在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中自动连接名为“userDao”的bean,HomeController在哪里?它在同一个包com.fyt.fyts中。您的userDao接口由多个类实现?添加spring上下文。你使用组件扫描吗?我已经更新了代码,请检查一下。