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

Java @@Controller类中的事务性方法不被视为事务性方法,java,spring,spring-mvc,Java,Spring,Spring Mvc,我注意到以下内容在标记为@Controller的类中不起作用: @Autowired SessionFactory sessionFactory; @ResponseBody @Transactional @RequestMapping(method = RequestMethod.GET , value = "/map") public ArrayList<PhotoDTO> getPhotos(...someParams) { Entity result session

我注意到以下内容在标记为
@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;
}
@Autowired
会话工厂会话工厂;
@应答器
@交易的
@RequestMapping(method=RequestMethod.GET,value=“/map”)
公共阵列列表getPhotos(…someParams){
实体结果sessionFactory.getCurrentSession()…//执行一些操作
返回结果;
}
当我调用URL时,我得到一个错误,表示该方法不是事务性的(尽管,正如您所看到的,它被标记为事务性的)

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


这是不是某种Spring建议(让我或多或少使用更多类的阴谋)?

不要在控制器中执行事务。将它们放在服务层类中

将代码分离到模型视图控制器中

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


一开始它可能看起来像是更多的代码,但从长远来看,它更易于管理和开发。

这里可能有两个应用程序上下文:由
ContextLoaderListener加载的主Spring上下文和由
DispatcherServlet
加载的子上下文。您还需要将
放入子上下文加载的配置中。如果你给我们看你的
web.xml
文件,也许我能帮你更多


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

这有点违反直觉,因为通常是在控制器中进行一系列权限测试,以确定当前用户是否可以执行某个操作。对于其中许多,我需要从DB访问数据。或者,我也可以在服务层中移动这些测试,但是,控制器的用途是什么:)有时候,对于基本CRUD,构建服务层只是为了代理对基本DAO方法的调用(如save或update…@pierrehynry ooo,我同意。我们在这里讨论了很多。