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

Pre*_*hev 2 java spring spring-mvc

我注意到以下内容不适用于标记为@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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nim*_*sky 9

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

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

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

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


sin*_*pop 9

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

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

  • 这回答了这个问题. (5认同)