powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Транзакции...?
4 сообщений из 4, страница 1 из 1
Транзакции...?
    #39067641
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Есть spring mvc контроллер, в нем метод:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Controller
public class ClientController{
@Autowired
ClientService clientService;
.....
@RequestMapping(value = "/createOrder", method = RequestMethod.POST)
    @ResponseBody
    public CreateOrderResponse createOrder(@RequestBody CreateOrderRequest request) {
          CreateOrderResponse response =  clientService.createOrder(request);
          .......


В сервисном слое ClientService:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
@Service
@Transactional
public class ClientService{
.........
    @Autowired
    OrderRepository orderRepository; // spring data
.........
public CreateOrderResponse  createOrder(CreateOrderRequest request){
    СОЗДАЮ ЗАКАЗ:
    Order order = new Order();
    order.set...
    ....
    order = orderRepository.save(order);

    ДАЛЕЕ Я ВЫЗЫВАЮ ДРУГОЙ МЕТОД ИЗ ClientService ДЛЯ ВЫПОЛНЕНИЯ НЕКОТОРОЙ ЛОГИКИ, Т.Е.:
    someLogic(order);    
}

.......
public void someLogic(Order order){
      ЗДЕСЬ ПРИ ПОПЫТКЕ ВЫЗВАТЬ ЧТО-ТО ТИПА:
      order.get....
      ПОЛУЧАЮ NullPointer exception
}


Почему я получаю исключение? Если я правильно поняла, то дело в особенностях работы с транзакциями. Видимо commit транзакции вызывается после завершения метода createOrder класса ClientService. Получается я пытаюсь работать с вновь созданным объектом Order в методе someLogic, в то время как коммит по нему не произошел. Я переделала так:
Код: java
1.
2.
3.
public Order createOrder(CreateOrderRequest request){
  return orderRepository.save(order);
}


И в контроллере:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    @RequestMapping(value = "/createOrder", method = RequestMethod.POST)
    @ResponseBody
    public CreateOrderResponse createOrder(@RequestBody CreateOrderRequest request) {
          Order order =  clientService.createOrder(request);
   
          ВЫЗОВ МОЕГО МЕТОДА ИЗ КОНТРОЛЛЕРА:
          someLogic(order);    
     return ....;
}


В результате все работает. Но мне не нравится, что бизнесс-логика находится в контроллере.
Прокомментируйте пожалуйста мою проблемму, особенно хочется услышать про особенности работы с транзакциями.
Спасибо
...
Рейтинг: 0 / 0
Транзакции...?
    #39067648
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT, стектрейс есть?
...
Рейтинг: 0 / 0
Транзакции...?
    #39068307
mrWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT, вот в этой статье хорошо про транзакции рассказано. Я думаю что там есть ответ на ваш вопрос.
...
Рейтинг: 0 / 0
Транзакции...?
    #39068431
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clientService.someLogic(...) - Вы вызываете через прокси ваш ClientService, а в первом варианте - из самого clientservice, т.е. там всякие вещи которые за кадром не вызываются (интерсепторы и т.д.). Возможно по этому. Здесь или разбивать на несколько сервисов, или вызывать не this.someLogic() а (как там с прингах) SpringCOntext.getBean("clientService").someLogic().
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Транзакции...?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]