繁体   English   中英

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

[英]@Transactional methods in @Controller class are not considred as transactional

我注意到以下内容在标记为@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的类并从控制器调用它,它就可以完美地工作

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM