如鵬網 大學生計算機學習社區

          CowNew開源團隊

          http://www.cownew.com 郵件請聯系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

          我正在寫一個小東西,用hibernate做數據層,用hessian提供的remoting做業務層,表現層通過http的方式取得業務層的服務,有的地方需要把PO傳遞到表現層(有人不同意把PO和VO重用,但是我的觀點是:大部分實體對象只要vo、po重用就可以了,只有vo、po差距較大的地方才分開,這樣就做到了簡潔性和可擴展性的良好折中)。
          但是在我將一個PO傳遞到表現層的時候出現了下面的問題:
          java.lang.InstantiationException: org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer
          ?at java.lang.Class.newInstance0(Unknown Source)
          ?at java.lang.Class.newInstance(Unknown Source)
          ?at com.caucho.hessian.io.JavaDeserializer.instantiate(JavaDeserializer.java:104)
          ?at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:54)
          ?at com.caucho.hessian.io.SerializerFactory.readMap(SerializerFactory.java:147)
          ?at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:781)
          ?at com.caucho.hessian.io.MapDeserializer.readMap(MapDeserializer.java:88)
          ?at com.caucho.hessian.io.SerializerFactory.readMap(SerializerFactory.java:149)
          ?at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:781)
          ?at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:69)
          ?at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:55)
          ?at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:658)
          ?at com.caucho.hessian.io.HessianInput.readReply(HessianInput.java:241)
          ?at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:179)
          ?at $Proxy2.loadByPK(Unknown Source)
          ?at com.cownew.PIS.demo.client.HelloTest.testDAO(HelloTest.java:85)
          ?at com.cownew.PIS.demo.client.HelloTest.main(HelloTest.java:94)
          java.lang.reflect.UndeclaredThrowableException
          ?at $Proxy2.loadByPK(Unknown Source)
          ?at com.cownew.PIS.demo.client.HelloTest.testDAO(HelloTest.java:85)
          ?at com.cownew.PIS.demo.client.HelloTest.main(HelloTest.java:94)
          Caused by: java.io.IOException: java.lang.InstantiationException: org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer
          ?at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:60)
          ?at com.caucho.hessian.io.SerializerFactory.readMap(SerializerFactory.java:147)
          ?at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:781)
          ?at com.caucho.hessian.io.MapDeserializer.readMap(MapDeserializer.java:88)
          ?at com.caucho.hessian.io.SerializerFactory.readMap(SerializerFactory.java:149)
          ?at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:781)
          ?at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:69)
          ?at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:55)
          ?at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:658)
          ?at com.caucho.hessian.io.HessianInput.readReply(HessianInput.java:241)
          ?at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:179)
          ?... 3 more

          我的這個對象是如下定義的:
          package com.cownew.PIS.demo.common;
          import com.cownew.PIS.framework.common.BaseObjectValue;

          public class MaterialInfo extends BaseObjectValue
          {??
          ?? private String Id;?????
          ?? private String Number;?????
          ?? private PersonInfo Manager;??
          ??
          ?? public void setId(String value)
          ?? {
          ???? this.Id=value;
          ?? }
          ??
          ??
          ?? public void setNumber(String value)
          ?? {
          ???? this.Number=value;
          ?? }
          ??
          ??
          ?? public void setManager(PersonInfo value)
          ?? {
          ???? this.Manager=value;
          ?? }
          ??
          ??
          ?? public String getId()
          ?? {
          ???? return Id;
          ?? }
          ??
          ??
          ?? public String getNumber()
          ?? {
          ???? return Number;
          ?? }
          ??
          ??
          ?? public PersonInfo getManager()
          ?? {
          ???? return Manager;
          ?? }
          ?????
          }
          經跟蹤發現原來是在反序列化getManager的返回值的時候出錯的。hibernate使用CGLIB實現的惰性加載,這樣getManager的返回值的類型其實是PersonInfo 的一個子類,其中有一個CGLIBLazyInitializer類型的字段,這個CGLIBLazyInitializer是沒有默認構造函數的,這樣就造成了反序列化失敗。
          我的解決方式是寫一個DTOAssembler來將PO手動轉換成VO,這個VO的類型和PO一樣,但是對于關聯屬性進行了針對CGLIB的特別處理。然后把轉換后的VO傳遞到表現層。
          請各位多指教。謝謝。

          ?

          posted on 2006-10-06 00:58 CowNew開源團隊 閱讀(2060) 評論(3)  編輯  收藏

          評論

          # re: 使用hessian將Hibernate的PO直接傳遞到表現層的問題 2006-10-09 16:39 rainsoft
          用OpenSessionInView解決  回復  更多評論
            

          # re: 使用hessian將Hibernate的PO直接傳遞到表現層的問題 2006-10-09 20:53 CowNew開源團隊
          謝謝樓上的兄弟,不過您可能沒有仔細看我的文章,我是要把PO通過remoting傳到遠程客戶端的,因此無法使用OpenSessionInView,我已經通過我說的那種DTO轉化器的方式解決了,稍后將貼出我的代碼。謝謝。  回復  更多評論
            

          # re: 使用hessian將Hibernate的PO直接傳遞到表現層的問題 2006-10-09 20:54 CowNew開源團隊
          稍后也將寫一篇批駁OSIV的文章,:)  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 额敏县| 正镶白旗| 桂平市| 河北省| 重庆市| 东平县| 克什克腾旗| 镇安县| 仁化县| 延川县| 会昌县| 宝兴县| 黔西| 镇沅| 鸡泽县| 奉贤区| 保定市| 栾城县| 大荔县| 雷波县| 延津县| 潜江市| 漳州市| 平顺县| 盐亭县| 缙云县| 林芝县| 南雄市| 山西省| 双桥区| 鄢陵县| 乃东县| 方正县| 策勒县| 原阳县| 衡阳县| 拉孜县| 遂川县| 四川省| 富民县| 治多县|