Senior
34
Бір қызмет ішінде (@Transactional) әдісті қалай шақыруға болады (өз-өзіне шақыру)?
Сұралған компаниялар
Octo
AI-дан жауап
sobes.tech AI
Вызов @Transactional метода внутри того же сервиса (self-invocation) не будет работать, если просто вызвать метод напрямую, потому что Spring прокси не перехватывает вызовы внутри одного объекта.
Чтобы обойти это ограничение, можно:
-
Вынести @Transactional метод в отдельный сервис и вызывать его через бин Spring.
-
Внутри текущего сервиса получить прокси самого себя через ApplicationContext и вызвать метод через прокси:
@Service
public class MyService {
@Autowired
private ApplicationContext context;
public void outerMethod() {
// Получаем прокси самого себя
MyService proxy = context.getBean(MyService.class);
proxy.transactionalMethod();
}
@Transactional
public void transactionalMethod() {
// транзакционный код
}
}
- Использовать AspectJ вместо прокси, тогда self-invocation будет работать, но это требует дополнительной настройки.
Чаще всего рекомендуют первый вариант — разделить логику на два бина.