混合@Transactional& REST Api上的@Controller语义

时间:2012-10-09 22:43:09

标签: spring-mvc spring-transactions

我想将后端公开为“资源”(如Restlet)并消除服务层,以便Rest资源可以直接与Dao交互。这样,Resource 就是合同而不是接口。

如果事务是由Spring本地管理的,那么在Spring MVC 3控制器上使用@Transactional语义是否存在问题?有回滚和捕获异常的任何问题吗?

@RequestMapping(value = "/user/{userId}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
@Transactional
public void updateUser(@PathVariable Long userId, @RequestBody ProfileUser user) {

   // dao update
}

spring config:
<tx:annotation-driven />
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

1 个答案:

答案 0 :(得分:0)

我认为你可能会遇到问题。默认情况下,Spring将使用JDK动态代理将事务行为应用于您的方法。这依赖于您的控制器实现合适的接口,即暴露updateUser方法的接口。春天有一篇很棒的博客文章blog

由于Spring无法在代理上找到该方法,您可能会看到错误。

如果告诉Spring使用基于CGLIB的代理,则可以使用上述方法。文档here中描述了这一点。