如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開源團(tuán)隊(duì)

          http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks

          我正在寫一個(gè)小東西,用hibernate做數(shù)據(jù)層,用hessian提供的remoting做業(yè)務(wù)層,表現(xiàn)層通過http的方式取得業(yè)務(wù)層的服務(wù),有的地方需要把PO傳遞到表現(xiàn)層(有人不同意把PO和VO重用,但是我的觀點(diǎn)是:大部分實(shí)體對(duì)象只要vo、po重用就可以了,只有vo、po差距較大的地方才分開,這樣就做到了簡(jiǎn)潔性和可擴(kuò)展性的良好折中)。
          但是在我將一個(gè)PO傳遞到表現(xiàn)層的時(shí)候出現(xiàn)了下面的問題:
          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

          我的這個(gè)對(duì)象是如下定義的:
          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;
          ?? }
          ?????
          }
          經(jīng)跟蹤發(fā)現(xiàn)原來是在反序列化getManager的返回值的時(shí)候出錯(cuò)的。hibernate使用CGLIB實(shí)現(xiàn)的惰性加載,這樣getManager的返回值的類型其實(shí)是PersonInfo 的一個(gè)子類,其中有一個(gè)CGLIBLazyInitializer類型的字段,這個(gè)CGLIBLazyInitializer是沒有默認(rèn)構(gòu)造函數(shù)的,這樣就造成了反序列化失敗。
          我的解決方式是寫一個(gè)DTOAssembler來將PO手動(dòng)轉(zhuǎn)換成VO,這個(gè)VO的類型和PO一樣,但是對(duì)于關(guān)聯(lián)屬性進(jìn)行了針對(duì)CGLIB的特別處理。然后把轉(zhuǎn)換后的VO傳遞到表現(xiàn)層。
          請(qǐng)各位多指教。謝謝。

          ?

          posted on 2006-10-06 00:58 CowNew開源團(tuán)隊(duì) 閱讀(2068) 評(píng)論(3)  編輯  收藏

          評(píng)論

          # re: 使用hessian將Hibernate的PO直接傳遞到表現(xiàn)層的問題 2006-10-09 16:39 rainsoft
          用OpenSessionInView解決  回復(fù)  更多評(píng)論
            

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

          # re: 使用hessian將Hibernate的PO直接傳遞到表現(xiàn)層的問題 2006-10-09 20:54 CowNew開源團(tuán)隊(duì)
          稍后也將寫一篇批駁OSIV的文章,:)  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 西城区| 华容县| 沾益县| 吉林市| 江陵县| 东城区| 广德县| 北流市| 安康市| 乌审旗| 肇庆市| 和田县| 托克托县| 平远县| 渝中区| 博湖县| 庆阳市| 贵州省| 客服| 姚安县| 韶山市| 丽水市| 黎城县| 华阴市| 舞钢市| 左权县| 长葛市| 深泽县| 青川县| 大洼县| 隆安县| 垣曲县| 大渡口区| 通州市| 西林县| 灵寿县| 黑龙江省| 宜宾市| 永胜县| 合阳县| 仁寿县|