【问题标题】:@Transactional methods in @Controller class are not considred as transactional@Controller 类中的 @Transactional 方法不被视为事务性方法
【发布时间】:2012-03-25 20:41:39
【问题描述】:

我注意到以下内容在标记为 @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 建议(让我或多或少使用更多类的阴谋)吗?

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

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

    将您的代码分离到模型-视图-控制器中。

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

    一开始似乎需要更多代码,但从长远来看,它更易于管理和开发。

    【讨论】:

    • 这有点反直觉,因为它通常是你进行一堆权限测试的控制器来判断当前用户是否可以执行某个操作。对于其中许多人,我需要访问数据库中的数据。或者,我也可以将这些测试放在服务层中,但是,控制器的目的是什么:)
    • 有时,对于基本的 CRUD,构建一个服务层只是为了代理对基本 DAO 方法的调用,如保存或更新...
    • @PierreHenry 哦,我同意。有很多关于这里的讨论。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多