`
nbkangta
  • 浏览: 430491 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

XStream with hibernate 解决Cannot handle CGLIB enhan

阅读更多
在hibernate下使用XStream会有Cannot handle CGLIB enhanced proxies with multiple callbacks的问题,原因在于hibernate取出来的集合对象其实不是POJO的集合,而是依赖于HIBERNATE API的代理对象,在网上找了下,找到这篇文章
先做记录,有时间做下翻译

以下的代码只在hibernate 2下面做了测试,但是理论上同样适用于hibernate 3

解决这个问题的关键在于,让JVM像处理java.util包下面的 Collection一样处理hibernate的Collection,这样就可以避免臭名昭著"com.thoughtworks.xstream.converters.ConversionException: Cannot handle CGLIB enhanced proxies with multiple callbacks..."异常。

主要分为三个步骤,首先,告诉Xstream像处理java Collection一样处理hibernate Collection

xstream.addDefaultImplementation(
        net.sf.hibernate.collection.List.class, java.util.List.class);
xstream.addDefaultImplementation(
        net.sf.hibernate.collection.Map.class, java.util.Map.class);
xstream.addDefaultImplementation(
        net.sf.hibernate.collection.Set.class, java.util.Set.class);


然后需要注册一些Coverter来帮助Xstream处理这些hibernaye Collection
Mapper mapper = xstream.getMapper();
xstream.registerConverter(new HibernateCollectionConverter(mapper));
xstream.registerConverter(new HibernateMapConverter(mapper));


这样,这些转换器就加入到了Xstream内建的转换器队列当中。在完成了具体的转换代码之后,Xstream就具备了处理hibernate Collection的能力

import net.sf.hibernate.collection.List;
import net.sf.hibernate.collection.Set;
import com.thoughtworks.xstream.converters.collections.CollectionConverter;
import com.thoughtworks.xstream.mapper.Mapper;

class HibernateCollectionConverter extends CollectionConverter {
    HibernateCollectionConverter(Mapper mapper) {
        super(mapper);
    }

    public boolean canConvert(Class type) {
        return super.canConvert(type) || type == List.class || type == Set.class; 
    }
}

and
import net.sf.hibernate.collection.Map;
import com.thoughtworks.xstream.converters.collections.MapConverter;
import com.thoughtworks.xstream.mapper.Mapper;

class HibernateMapConverter extends MapConverter {

    HibernateMapConverter(Mapper mapper) {
        super(mapper);
    }

    public boolean canConvert(Class type) {
        return super.canConvert(type) || type == Map.class; 
    }
}



这些就是全部了,基本可以解决Hibernate + Xstream出现的问题,Good Luck!
分享到:
评论

相关推荐

    xstream-1.3.1-sae-liufeng

    修改XStream源码,解决SAE不支持XStream的问题。

    解决XStream注解同名冲突

    多个类注解@XStreamAlias,value相同、且在集合上使用了@XStreamImplicit会出现异常: com.thoughtworks.xstream.converters.ConversionException: No field 'null' found in class '.....(注解的...该包解决了这个bug

    最齐全的xstream1.4.8.jar

    最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...

    xstream-1.4.2.jar

    《XStream详解与应用》 ...总之,XStream是一个强大且灵活的工具,对于处理Java对象与XML之间的转换,它提供了简洁、高效的解决方案。无论你是新手还是经验丰富的开发者,都能从XStream的易用性和强大功能中受益。

    xstream-1.4.15.jar

    XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    xstream学习文档及实例

    XStream 可以轻松地与 Spring、Hibernate 等框架集成,实现数据的持久化和交换。 总结,XStream 是一个强大且灵活的 Java 库,它简化了 Java 对象与 XML 之间的转换。通过深入学习和实践,开发者可以充分利用 ...

    xstream教程资料.rar

    XStream可以与Spring框架、Hibernate等库无缝集成,提供更便捷的数据持久化和传输方案。 八、实战案例 在"XStream+技术指南.docx"中,你将找到丰富的实践示例,涵盖基础操作、复杂类型转换、安全配置等多个方面,...

    xstream-1.4-API

    通过了解以上关键概念,你可以充分利用 XStream 的强大功能,无论是简化数据存储,还是在分布式系统中传递数据,XStream 都能提供简洁、高效的解决方案。在实际项目中,结合文档和 `xstream-1.4-API` 中的示例,你将...

    xstream1.4.15.JAR

    XStream 1.4.15 版本的更新主要目的是解决这些安全问题。开发者引入了新的安全特性,比如默认禁止不受信任的数据源反序列化,以及提供更严格的黑名单策略,来阻止潜在危险类的实例化。这些改进确保了只有白名单中的...

    Xstream 相关jar包

    6. **与其他框架集成**:Xstream可以轻松地与Spring、Hibernate等其他Java框架集成,提供更强大的数据序列化和反序列化解决方案。 7. **版本兼容性**:Xstream具有良好的版本兼容性,即使Java类结构发生变化,只要...

    xstream-1.4.2

    6. **兼容性**:XStream 1.4.2支持Java SE 5.0及更高版本,以及大部分流行的企业级框架,如Spring、Hibernate等。 二、XStream的使用方法 1. **基本序列化与反序列化**:通过`XStream.fromXML()`和`xstream.toXML...

    xstream解析依赖包

    《XStream解析依赖包详解》 在Java开发中,数据序列化是一个不可或缺的环节,它使得对象的状态可以被保存和恢复。XStream是一款强大的Java库,用于将Java对象转换为XML,反之亦然,极大地简化了序列化和反序列化的...

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    XStream库提供了一个简单、直观的方式来实现这种转换,使得XML序列化和反序列化变得非常方便。本篇将详细介绍XStream如何处理XML与Java对象的相互转换,以及如何处理List、Map等集合类型的数据。 首先,XStream是一...

    xStream完整Jar包

    **XStream 概述** XStream 是一个 Java 库,用于将对象序列化为 XML,以及从 XML 反序列化回对象。它提供了一种简单而直观的方式来处理 XML 数据,使得 XML 文档与 Java 对象之间的转换变得轻而易举。这个“xStream...

    xstream相关的jar包

    XStream是一款强大的Java库,用于将Java对象序列化为XML,反之亦然。这个库的主要优点在于其简单易用的API和对复杂对象图的处理能力。在标题中提到的"Xstream相关的jar包",是指为了使用XStream库,需要引入的依赖...

    xstream-1.4.5.jar

    xstream xstream-1.4.5.jar

    Oracle Database XStream Guide 11g Release 2 (11.2)-302

    * XStream 的管理和监控工具可以帮助用户快速定位和解决问题。 * XStream 的管理和监控工具可以集成到 Oracle 企业管理器中,提供统一的管理界面。 Oracle Database XStream 是一个功能强大且灵活的数据捕获和事件...

    Java用xStream拼接xml

    当需要将数据转换为XML格式以便于传输或处理时,工具如xStream就显得尤为重要。Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream...

    XStream解析各种数据格式

    ### XStream解析各种数据格式...无论是在简单的数据交换场景下还是在复杂的系统集成中,XStream 都能提供有效的解决方案。通过本文介绍的基本使用方法和高级特性,开发者可以更好地利用 XStream 来满足项目的实际需求。

Global site tag (gtag.js) - Google Analytics