解決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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章