在我的spring boot hibernate项目中,我在@Service
上使用public class UserSerivce implements IUserSerivce {
并且它工作正常,但我想在一个事务中让这个服务中的方法,所以我添加@Transactional
这堂课也。添加@Transactional
注释后,我的项目在启动时崩溃了。例外情况如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.hnu.service.impl.UserSerivce com.hnu.controllers.UserController.userSerivce; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.hnu.service.impl.UserSerivce] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
.........
我的项目代码如下:
UserSerivce.java
package com.hnu.service.impl;
import com.hnu.model.User;
import com.hnu.model.UserDao;
import com.hnu.service.interfaces.IUserSerivce;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* Created by shiqin_zhang@qq.com on 6/27/16.
*/
@Service
@Transactional // beancreationexception when add @transactional annotation
public class UserSerivce implements IUserSerivce {
@Autowired
private UserDao userDao;
@Override
public void delete(User user) {
userDao.delete(user);
}
@Override
public void save(User user) {
userDao.save(user);
}
}
UserDao.java
package com.hnu.model;
import com.hnu.base.BaseDAO;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserDao extends BaseDAO<User>{
}
BaseDAO.java
package com.hnu.base;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.GenericTypeResolver;
import java.util.List;
/**
* Created by shiqin_zhang@qq.com on 6/27/16.
*/
public class BaseDAO<T> {
private Class<T> inferedClass = null;
private Class<T> getInferedClass() {
if(inferedClass == null){
GenericTypeResolver.resolveTypeArgument(getClass(), BaseDAO.class);
}
return inferedClass;
}
@Autowired
public SessionFactory sessionFactory;
private Session getSession() {
return sessionFactory.getCurrentSession();
}
public void save(T t) {
getSession().save(t);
return;
}
public void delete(T t) {
getSession().delete(t);
return;
}
@SuppressWarnings("unchecked")
public List<T> getAll(){
return getSession().createQuery("from " + getInferedClass().getSimpleName()).list();
}
}
我的数据库配置为DatabaseConfig.java
:
package com.hnu.configs;
import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class DatabaseConfig {
@Value("${db.driver}")
private String DB_DRIVER;
@Value("${db.password}")
private String DB_PASSWORD;
@Value("${db.url}")
private String DB_URL;
@Value("${db.username}")
private String DB_USERNAME;
@Value("${hibernate.dialect}")
private String HIBERNATE_DIALECT;
@Value("${hibernate.show_sql}")
private String HIBERNATE_SHOW_SQL;
@Value("${hibernate.hbm2ddl.auto}")
private String HIBERNATE_HBM2DDL_AUTO;
@Value("${entitymanager.packagesToScan}")
private String ENTITYMANAGER_PACKAGES_TO_SCAN;
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(DB_DRIVER);
dataSource.setUrl(DB_URL);
dataSource.setUsername(DB_USERNAME);
dataSource.setPassword(DB_PASSWORD);
return dataSource;
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
hibernateProperties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
hibernateProperties.put("hibernate.hbm2ddl.auto", HIBERNATE_HBM2DDL_AUTO);
sessionFactoryBean.setHibernateProperties(hibernateProperties);
return sessionFactoryBean;
}
@Bean
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}
}
UserController.java
package com.hnu.controllers;
import com.hnu.model.User;
import com.hnu.service.impl.UserSerivce;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private UserSerivce userSerivce;
@RequestMapping(value = "/delete")
@ResponseBody
public String delete(long id) {
try {
User user = new User(id);
userSerivce.delete(user);
} catch (Exception ex) {
return ex.getMessage();
}
return "User succesfully deleted!";
}
}
答案 0 :(得分:0)
在UserController
更改
@Autowired
private UserSerivce userSerivce; // Implementation
到
@Autowired
private IUserSerivce userSerivce; // interface
这将解决问题。
您也可以在班级或方法级别获得@Transactional