Транзакционная аннотация не работает с конструктором Autowired - PullRequest
0 голосов
/ 02 июля 2019

У меня следующая ситуация:

@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 аннотация для работы?

1 Ответ

0 голосов
/ 02 июля 2019

Используя этот метод, 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);
    }
}

Таким образом, бин правильно проксируется, и инфраструктура AOP может применять необходимые аннотации.

...