我注意到以下内容不适用于标记为@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的建议(一种阴谋让我或多或少地使用更多的课程)?
答案 0 :(得分:9)
不要在控制器中进行交易。将它们放在服务层类中。
将您的代码分成模型 - 视图 - 控制器。
是的,这是一个阴谋。它使您能够在不重复代码的情况下在控制器/视图之间共享代码。并且还会不必要地停止事务回滚(对于与实际事务无关的异常)。
开始时看起来似乎更多的代码,但从长远来看,它更易于管理和开发。
答案 1 :(得分:9)
这里可能有两个应用程序上下文:ContextLoaderListener
加载的主要Spring上下文和DispatcherServlet
加载的子上下文。您还需要将<tx:annotation-driven />
放在子上下文加载的配置中。如果您向我们展示您的web.xml
文件,我可以为您提供更多帮助。
无论如何,正如@NimChimpsky所说,管理控制器层中的交易通常不是一个好习惯。