配置Hikari连接池时如何解决@Transactional注释问题?

时间:2020-09-07 14:25:08

标签: spring spring-boot hibernate spring-transactions

用@Transactional注释我的服务实现类时,我面临以下问题

APPLICATION FAILED TO START
***************************

Description:

The bean 'BusinessServiceImpl ' could not be injected as a 'com.business.service.BusinessServiceImpl ' because it is a JDK dynamic proxy that implements:
    com.business.service.BusinessService


Action:

Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching.```

Transactional and Hikari Connection pool configuration:

 @Configuration
 @EnableTransactionManagement
 public class HibernateConfiguration {

@Autowired
private Environment environment;

@Bean
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan("com.business.model");
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
 }

@Bean
public DataSource dataSource() {
    HikariDataSource dataSource = new HikariDataSource();
    dataSource.setPoolName("ConnectionPool");
    dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
    dataSource.setJdbcUrl(environment.getRequiredProperty("jdbc.url"));
    dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
    dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
    dataSource.setMaximumPoolSize(20);
    dataSource.setConnectionTimeout(TimeUnit.MINUTES.toMillis(10)); // default is 30000
    dataSource.setInitializationFailFast(true);
    dataSource.setIdleTimeout(TimeUnit.MINUTES.toMillis(10));
    dataSource.setMinimumIdle(3);
    dataSource.setMaxLifetime(TimeUnit.MINUTES.toMillis(15));
    dataSource.setIdleTimeout(TimeUnit.MINUTES.toMillis(10));
    // Following two properties for monitoring purpose
    dataSource.setLeakDetectionThreshold(TimeUnit.MINUTES.toMillis(2));
    dataSource.setRegisterMbeans(true); //As we are setting this property using HikariCP, We have to disable the default Mbean exporter() method 
    return dataSource;
}

@Bean
public MBeanExporter exporter() {
    final MBeanExporter exporter = new MBeanExporter();
    exporter.setAutodetect(true);
    exporter.setExcludedBeans("dataSource");
    return exporter;
}

private Properties hibernateProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
    properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
    properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
    return properties;        
}

@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
    return new HibernateTransactionManager(sessionFactory().getObject());
}
    }

服务实现类:

  @Service
  @SuppressWarnings("unchecked")
  @Transactional
  public class BusinessServiceImpl implements BusinessService {

   @Autowired
   private EmployeeManagementDao employee;
   
   ...............
   }

服务接口:

  public interface BusinessService {
          
       -----------
  }

我试图通过参考以下答案来解决问题:

Transactional annotation error

但是它不能解决我的问题。

我为其他实现类进行了相同类型的自动装配,工作正常,但在此类中我遇到了问题。

有人可以帮我吗?

Spring Boot主类:

  @SpringBootApplication
  @Configuration
  public class BusinessWebApplication extends SpringBootServletInitializer {

public static void main(String[] args) {
    
    SpringApplication.run(BusinessWebApplication .class, args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    setRegisterErrorPageFilter(false); 
    return application.sources(applicationClass);
}

private static Class<BusinessWebApplication> applicationClass = BusinessWebApplication .class;
  }

在RetailBusinessServiceImpl中,由于需要使用BusinessServiceImpl中的某些方法,因此我正在自动装配BusinessServiceImpl类

   @Service
   @Transactional
   public class RetailBusinessServiceImpl implements RetailBusinessService {

   @Autowired
   private BusinessServiceImpl service;

    }

服务类别:

   public interface RetailBusinessService {

}

0 个答案:

没有答案