ajax架構與SSH互動總返回error
FireFox查看異常顯示
Class org.apache.struts2.json.JSONWriter can not
access a member of class
org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper with
modifiers "public"
發現一個規律,凡是在struts2 pojo action中有對象屬性的,並被hibernate管理的,都會出現這種問題。因為hibernate會給每個被管理的對象加上hibernateLazyInitializer屬性,同時struts-jsonplugin或者其他的jsonplugin都是通過java的反射機制將pojo轉換成json的,但是hibernateLazyInitializer無法由反射得到,所以就拋異常了。
這種問題同樣發生在spring mvc的通過ajax訪問SSH2中。
解決方案:
第一種方法:將POJO Action中hibernate管理對象的get方法去掉,同時在struts2的struts.xml檔案中的<result type="json"></result>加入<param
name="excludeProperties">.*hibernateLazyInitializer</param>:
<result type="json">
<param
name="excludeProperties">.*hibernateLazyInitializer</param>
</result>
用於使用struts-jsonplugin的情況。
第二種方法:在pojo的類上加入annotation來排除hibernateLazyInitializer 這個屬性:
annotation:
@JsonIgnoreProperties(value={"hibernateLazyInitializer"})
用於使用jackson來轉移json對象的情況。