spring boot hibernate使用@Transactional,嵌套异常BeanCreationException在启动时显示

时间:2016-06-28 02:32:04

标签: java spring hibernate transactions

在我的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!";
    }

}

1 个答案:

答案 0 :(得分:0)

UserController

更改

@Autowired
private UserSerivce userSerivce; // Implementation

@Autowired
private IUserSerivce userSerivce; // interface

这将解决问题。

您也可以在班级或方法级别获得@Transactional