关于事物默认使用JDK动态代理导致的错误

//错误代码
   @Scheduled(cron = "0 0 2 * * ?")
   @Transactional(rollbackFor = Exception.class)
    public void sampleTaskManagement() {
    //.......
    }

问题描述:在定时任务上加了事物注解报错
Caused by: java.lang.IllegalStateException: Need to invoke method ‘sampleTaskManagement’ declared on target class ‘SampleTaskManagementSchedule’, but not found in any interface(s) of the exposed proxy type. Either pull the method up to an interface or switch to CGLIB proxies by enforcing proxy-target-class mode in your configuration.

这个错误提示说明在目标类(SampleTaskManagementSchedule)的代理类型中没有找到被代理的方法(sampleTaskManagement)的声明。这可能是因为你的配置使用了基于接口的代理(JDK动态代理),但目标类中没有相应的接口

事务的实现是通过AOP(面向切面编程)来实现的。当你在方法上添加@Transactional注解时,Spring就会创建一个动态代理来管理事务,如果没有显式地配置,Spring将默认使用JDK动态代理。而JDK动态代理要求被代理的类必须实现接口,因此会导致该问题。

将事物的代理方式改为cglib,或者创建该类的接口

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class AppConfig {
    // 其他配置
}

你可能感兴趣的:(java,开发语言)