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

时间:2012-03-08 10:46:28

标签: 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;
}

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

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

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

2 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:9)

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

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