2012-10-09 65 views
1

我想將後端顯示爲'Resources'(如Restlet)並消除服務層,這樣Rest Resource可以直接與Dao交互。這種方式的資源合同而不是接口。在REST Api上混合@Transactional&@Controller語義

如果事務由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"> 

回答

0

我想你可能會遇到問題。默認情況下,Spring將使用JDK動態代理將事務行爲應用於您的方法。這依賴於你的控制器實現一個合適的接口,即暴露updateUser方法的接口。春季有一篇優秀的博客文章blog

由於Spring無法在代理上找到該方法,您很可能會看到錯誤。

如果您告訴Spring使用基於CGLIB的代理,那麼您可以使用上述方法。這在文檔here中有描述。