首页 > 解决方案 > 事务注释不适用于 Autowired 构造函数

问题描述

我有以下情况:

@Service
public class MyService {
    private final MyRepository repository;

    @Autowired
    public MyService(MyRepository repository){
        this.repository = repository;
    }

    public List<Data> getData(){
        return repository.findAll();
    }

    @Transactional
    public void saveData(Data data){
        repository.save(data);
    }
}

当我调用该saveData方法时,@Transactional未应用注释并且该方法抛出 TransactionRequiredException。

如何启用@Transactional注释?

标签: spring-data-jpaspring-batchautowiredspring-transactions

解决方案


使用这种方法,Spring 出于某种原因错误地初始化了 bean 并且没有应用注解。

我发现的一种解决方法是使用字段自动装配而不是构造函数自动装配。像这样:

我有以下情况:

@Service
public class MyService {
    @Autowired
    private MyRepository repository;

    public List<Data> getData(){
        return repository.findAll();
    }

    @Transactional
    public void saveData(Data data){
        repository.save(data);
    }
}

这样 bean 被正确代理,AOP 框架可以应用必要的注解。


推荐阅读