Методы @Transactional в классе @Controller не рассматриваются как транзакционные - PullRequest
2 голосов
/ 08 марта 2012

Я заметил, что следующее не работает в классе, помеченном как @Controller:

@Autowired
SessionFactory sessionFactory;

@ResponseBody
@Transactional
@RequestMapping(method = RequestMethod.GET , value = "/map")

public ArrayList<PhotoDTO> getPhotos(...someParams) {
   Entity result sessionFactory.getCurrentSession()... //do some manipulation

  return result;
}

, когда я вызываю URL, я получаю сообщение об ошибке, говорящее, что метод не транзакционный (хотя,как видите, он помечен как единое целое)

Если я скопирую этот метод в другой класс с именем MyService и вместо этого вызову его из контроллера, он отлично работает

Это какой-тоВесенний совет (заговор с целью заставить меня использовать больше или больше классов)?

Ответы [ 2 ]

9 голосов
/ 08 марта 2012

Возможно, у вас есть два контекста приложения: основной контекст Spring, загруженный ContextLoaderListener, и дочерний контекст, загруженный DispatcherServlet. Вам также необходимо указать <tx:annotation-driven /> в конфигурации, загруженной дочерним контекстом. Если вы покажете нам свой файл web.xml, возможно, я смогу вам помочь.

В любом случае, как говорит @NimChimpsky, обычно не рекомендуется управлять транзакциями на уровне контроллера.

9 голосов
/ 08 марта 2012

Не выполняйте транзакции в вашем контроллере. Поместите их в свои классы слоя обслуживания.

Разделите ваш код на модель-представление-контроллер.

Да, это заговор. Это позволяет вам обмениваться кодом между контроллерами / представлениями без повторения кода. А также останавливает откат транзакций без необходимости (за исключением случаев, не связанных с реальной транзакцией).

Может показаться, что для начала нужно больше кода, но в долгосрочной перспективе его намного проще и проще разрабатывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...