分析出現no Session錯誤的原因以及給出解決方案: 使用SpringMVC + JSON數據返回時,經常會出現no Session的錯誤: 報錯原因:因為懶載入在提取關聯對象的屬性值的時候發現EntityManager已經被關閉,就報no session錯誤。 控制器類中的方法上添加了@Res ...
分析出現no Session錯誤的原因以及給出解決方案:
使用SpringMVC + JSON數據返回時,經常會出現no Session的錯誤:
報錯原因:因為懶載入在提取關聯對象的屬性值的時候發現EntityManager已經被關閉,就報no session錯誤。
控制器類中的方法上添加了@ResporseBody註解,將方法的返回值利用jackson包自動轉化為JSON字元串,然後放入響應消息體中,最後發送到瀏覽器;
然而jackson包都會自動調用對象的屬性的get方法來獲取屬性的值拼接成JSON字元串,而調用get方法就需要自動發送SQL語句去查詢關聯對象的數據,結果發現EntityManager對象已經關閉了,已經無法在通過EntityManager對象去查詢關聯對象的get方法,所以就會報 no session異常。
解決辦法:讓關閉EntityManager對象的動作延後到提取懶載入對象的數據之後再關閉。
具體做法:在web.xml中添加一個過濾器OpenEntityManagerInViewFilter,使EntityManager對象的開啟和關閉在視圖層發生。
<!-- 解決no session問題 --> <filter> <filter-name>noSessionFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>noSessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>