2012-03-08 23 views
2

我注意到,以下未標記爲@Controller類工作:@Transactional方法不considred爲事務

@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和控制器,而不是把它(雖然,你可以看到,它被標記爲一個)

的方法不是事務性的,它完美

是這是某種春天a dvice(使我更多或更少使用更多類的陰謀)?

回答

9

不要在您的控制器中進行交易。把它們放在你的服務層類中。

將您的代碼分離到模型視圖控制器中。

是的,這是一個陰謀。它使您能夠在控制器/視圖之間共享代碼而無需重複代碼。並且還會不必要地停止事務回滾(對於與實際事務無關的異常)。

看起來好像更多的代碼開始,但從長遠來看,開發更容易管理和更簡單。

+0

這是有點直觀的,因爲它通常是控制器,你做了一堆權限測試,以說明當前用戶是否可以執行某個操作。對於那些我需要從數據庫訪問數據的人。另外,我可以把這些測試也移到服務層,但是,那麼,控制器的目的是什麼:) – preslavrachev 2012-03-13 08:43:20

+0

有時候,對於基本的CRUD,似乎是矯枉過正的構建一個服務層只是爲了調用基本的DAO方法保存或更新... – 2013-11-06 17:18:34

+0

@PierreHenry oooo,我同意。有很多關於這方面的討論。 – NimChimpsky 2013-11-06 18:09:47

9

也許你在這裏有兩個應用程序上下文:由ContextLoaderListener加載的主要Spring上下文和由DispatcherServlet加載的子上下文。您還需要將<tx:annotation-driven />放置在子環境加載的配置中。如果您向我們顯示您的web.xml文件,也許我可以幫助您更多。

無論如何,正如@NimChimpsky所說,管理控制層中的事務通常不是一個好習慣。

+5

這回答了這個問題。 – sourcedelica 2012-03-09 02:39:37

相關問題