解決Jsonwriter發生的Positioned Update not supported問題
有一次用jsonplugin輸出json的時候,發生了以下異常:java.sql.SQLException: Positioned Update not supported,其實以前也遇到過這種問題,原因也找到了,是因爲我們生成json的類是hibernate的model類,當中有一些對象是延遲加載的,這些對象並不是原model類中的屬性,而是由cglib這個字節碼生成器動態生成的對象。Hibernate在這個子類中添加了hibernateLazyInitializer等等的附加屬性。由於jsonplugin並不區分類和動態生成的類,所以也會試圖序列化hibernateLazyInitializer屬性,從而導致出現上述的異常。
以前項目時間緊急,採用了治標不治本的緊急應對方法:將那些延遲加載的對象都用一個默認構造方法的對象來代替,但這樣不利用複用。
在網上以Positioned Update not supported爲關鍵字搜索了一下,發現了一篇很有用的文章,文本也提到這個問題,並給出瞭解決方法。不過我卻發現文本提到的jsonplugin和我們項目中使用的jsonplugin有些地方不太相同,但它的思路都是一樣的。沿用這個思路應該就可以解決問題了。
思路如下:
1、判斷這個對象是否由cglib生成的。代碼如下:
boolean isCreateByCGLIB = clazz.getName().indexOf("$$EnhancerByCGLIB$$") > -1 ? true : false;
如果此對象確實是由cglib生成的,那麼我們取此對象的基類,這一步很關鍵,因爲通過取得此對象的基類,我們就忽略了所有由cglib生成的跟hibernate相關的屬性。
2、通過反射,取得此對象的所有繼續於基類的屬性。
3、通過反射,取得此對象的所有get方法器(這一步不能省,不然出來的屬性就少了)。
4、輸出json。
問題解決,開源的力量就是偉大。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/visualcatsharp/archive/2008/12/22/3580225.aspx
以前項目時間緊急,採用了治標不治本的緊急應對方法:將那些延遲加載的對象都用一個默認構造方法的對象來代替,但這樣不利用複用。
在網上以Positioned Update not supported爲關鍵字搜索了一下,發現了一篇很有用的文章,文本也提到這個問題,並給出瞭解決方法。不過我卻發現文本提到的jsonplugin和我們項目中使用的jsonplugin有些地方不太相同,但它的思路都是一樣的。沿用這個思路應該就可以解決問題了。
思路如下:
1、判斷這個對象是否由cglib生成的。代碼如下:
boolean isCreateByCGLIB = clazz.getName().indexOf("$$EnhancerByCGLIB$$") > -1 ? true : false;
如果此對象確實是由cglib生成的,那麼我們取此對象的基類,這一步很關鍵,因爲通過取得此對象的基類,我們就忽略了所有由cglib生成的跟hibernate相關的屬性。
2、通過反射,取得此對象的所有繼續於基類的屬性。
3、通過反射,取得此對象的所有get方法器(這一步不能省,不然出來的屬性就少了)。
4、輸出json。
問題解決,開源的力量就是偉大。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/visualcatsharp/archive/2008/12/22/3580225.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.