@Controller类中的@Transactional方法不被视为事务性的

我注意到以下内容不适用于标记为@Controller的类:

 @Autowired SessionFactory sessionFactory; @ResponseBody @Transactional @RequestMapping(method = RequestMethod.GET , value = "/map") public ArrayList getPhotos(...someParams) { Entity result sessionFactory.getCurrentSession()... //do some manipulation return result; } 

当我调用URL时,我得到一个错误,说该方法不是事务性的(尽管如您所见,它被标记为一个)

如果我将此方法复制到另一个名为MyService的类并从控制器调用它,它就可以完美地工作

这是一种Spring建议(一个让我多或少使用更多课程的阴谋)?

不要在控制器中进行交易。 将它们放在服务层类中。

将代码分成模型 – 视图 – 控制器。

是的,这是一个阴谋。 它使您能够在控制器/视图之间共享代码而无需重复代码。 并且还会不必要地停止事务回滚(对于与实际事务无关的exception)。

这看起来似乎是更多的代码,但从长远来看,它更易于管理和开发。

这里可能有两个应用程序上下文: ContextLoaderListener加载的主要Spring上下文和DispatcherServlet加载的子上下文。 您还需要在子上下文加载的配置中放置 。 如果您向我们展示您的web.xml文件,我可以帮助您。

无论如何,正如@NimChimpsky所说,管理控制器层中的事务通常不是一个好习惯。