`
dengminghua1016
  • 浏览: 125278 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转 解决json转换hibernate 结果集对象

    博客分类:
  • java
 
阅读更多
在使用ext+ssh框架过程中,当使用jsonlib 转换 hibernate的延迟加载对象时,会出现报错。为解决此处错误,我们可以参考网友网上给的解决思路,大概就是:


	public static JsonConfig getCommonConfig() {
		/*---- 做属性配置 start------*/
		JsonConfig conf = new JsonConfig();
		conf.registerJsonBeanProcessor(   
	            org.hibernate.proxy.HibernateProxy.class,   
	            new HibernateJsonBeanProcessor());   
	        conf.setJsonBeanProcessorMatcher(new HibernateJsonBeanProcessorMatcher());
		return conf;
	}

}

class HibernateJsonBeanProcessorMatcher extends JsonBeanProcessorMatcher {   
  
    @Override  
    public Object getMatch(Class target, Set set) {   
    if (target.getName().contains("$$EnhancerByCGLIB$$")) { 
        return org.hibernate.proxy.HibernateProxy.class;   
    }   
    return DEFAULT.getMatch(target, set);   
    }   
}

class HibernateJsonBeanProcessor implements JsonBeanProcessor {   
    public JSONObject processBean(Object obj, JsonConfig jsonConfig) {   
    	 LazyInitializer lazyInitializer = ((HibernateProxy)obj).getHibernateLazyInitializer(); 
         if(lazyInitializer.isUninitialized()) { 
         } 

    return new JSONObject();   
    }   
}




在这种情况下,报错是解决了,但是输出的json对象串却是xxx:{}。
但是还需要这些数据,网上给出问题解决办法是使用vo之类的,个人感觉这样需要创建非长多的vo,使用繁琐。于是乎自己就琢磨使用反射,把hibernate的代理对象的数据取出来,转化为普通对应对象。结果还好,成功了。但是性能未进行测试,个人认为反射会带来性能的损失。现在代码贴出来,大家拍砖,分析哪方面需要改进。

目前只能支持一级抓取。

在使用ext+ssh框架过程中,当使用jsonlib 转换 hibernate的延迟加载对象时,会出现报错。为解决此处错误,我们可以参考网友网上给的解决思路,大概就是:
/**
	 * 
	    * 功能描述:  解决hibernate 延迟加载对象问题
	    * @param dataList 数据集
	    * @param clazz 结果集内对象的class
	    * @return: void
	    * @author: lb
	    * @version: 2.0
	 */
	public static List listCrawl(List dataList,Class clazz){
		String ss="java.lang.String,java.util.Date,java.lang.Integer,java.lang.Long,int,float,long";
		String filterType="java.util.Map,java.util.HashMap,java.util.Set,java.util.HashSet";
		try{
		for(int i=0;i<dataList.size();i++){
			Object originalObj=dataList.get(i);//原始数据对象
			Method[] originalMethods= clazz.getDeclaredMethods();//原始数据对象的方法
			for(Method originalMethod:originalMethods){
				System.out.println("original MethodName:  "+originalMethod.getName());
				if(originalMethod.getName().contains("get")){
					System.out.println("getMethod returnType: "+originalMethod.getReturnType().getName());
					String returnType=originalMethod.getReturnType().getName();//get方法返回的对象类型
					if(!ss.contains(returnType)&&!filterType.contains(returnType)){//不是基本类型和Set Map等集合,即是二级对象
						Object proxyObjct=originalMethod.invoke(originalObj, null);//二级hibernate代理对象
						if(proxyObjct!=null){//二级代理对象是否为空
						Class proxyClass=proxyObjct.getClass();
						Method[] proxyMethods=proxyClass.getDeclaredMethods();
						
						Class tempClazz=Class.forName(returnType);//创建一个hibernate代理的原始二级对象
						Object tempObject=tempClazz.newInstance();//创建一个hibernate代理的原始二级对象
						
						for(Method proxyMethod:proxyMethods ){//
							if(ss.contains(proxyMethod.getReturnType().getName())){//只抓取hibernate代理的二级对象的基础数据
							if(proxyMethod.getName().contains("get")){
								Object returnValue=proxyMethod.invoke(proxyObjct, null);//
								System.out.println("proxy  returnValue:"+returnValue);
								String setMethod=proxyMethod.getName().replace("get", "set");
								System.out.println("setMethod name:"+setMethod);
								Method tempMethod=tempClazz.getDeclaredMethod(setMethod, proxyMethod.getReturnType());
								tempMethod.invoke(tempObject, returnValue);
							}
							}
						}
						Method originalMethod1=clazz.getDeclaredMethod(originalMethod.getName().replace("get", "set"), originalMethod.getReturnType());
						originalMethod1.invoke(originalObj, tempObject);//为原始对象重新装入一个非hibernate代理对象
						
						}
						
					}
					}
			}
		}
		}catch(Exception e){
			System.out.println("处理加载对象出现问题");
			e.printStackTrace();
		}
		
		return dataList;
	}


在这种情况下,报错是解决了,但是输出的json对象串却是xxx:{}。
但是还需要这些数据,网上给出问题解决办法是使用vo之类的,个人感觉这样需要创建非长多的vo,使用繁琐。于是乎自己就琢磨使用反射,把hibernate的代理对象的数据取出来,转化为普通对应对象。结果还好,成功了。但是性能未进行测试,个人认为反射会带来性能的损失。现在代码贴出来,大家拍砖,分析哪方面需要改进。

目前只能支持一级抓取。

在使用ext+ssh框架过程中,当使用jsonlib 转换 hibernate的延迟加载对象时,会出现报错。为解决此处错误,我们可以参考网友网上给的解决思路,大概就是:
分享到:
评论

相关推荐

    hibernate 配置文件 java类 生成工具

    2. 增加了toJson 方法,可以将对象转换为 json数据格式; 3. 去掉了部分无用代码; 4. 修正了toString 中多余逗号的问题; 5. 去掉了HBM文件中旧的缓存代码; 6. 修正了端口输入方式,直接在IP地址后面增加端口...

    REST-Services-MySQL:Spark 框架 JEE

    要将对象转换为 JSON 并将 JSON 转换为对象,我们需要某种方式来序列化和反序列化。 这就是 Google 的 GSON 存在的目的。 安装 克隆存储库 在 Eclipse 中:文件 -&gt; 导入 -&gt; “现有 Maven 项目” 在 MySQL 中创建...

    nutz-1.b.52.zip

    Castors -- Java 对象类型转换 Lang -- 更简洁的 Java 函数以及更丰富的反射支持 Aop -- 轻便快速的切面编程支持 Plugin -- 轻便的插件机制 Resource -- 资源扫描 它所有的功能均不依赖第三方 jar 包 这就意味着: ...

    web开发常用jar

    一个语言转换工具, Hibernate利用它实现 HQL 到 SQL 的转换模板相关操作需要包 javassist-3.9.0.GA.jar 代码生成工具 Hibernate用它在运行时扩展 Java类和实现,同cglib包 slf4j-api-1.5.8.jar和slf4j-log4j12...

    Spring攻略(第二版 中文高清版).part2

    9.4 用REST服务发布JSON 372 9.4.1 问题 372 9.4.2 解决方案 372 9.4.3 工作原理 372 9.5 访问具有复杂XML响应的REST服务 375 9.5.1 问题 375 9.5.2 解决方案 375 9.5.3 工作原理 375 9.6 小结 ...

    Spring攻略(第二版 中文高清版).part1

    9.4 用REST服务发布JSON 372 9.4.1 问题 372 9.4.2 解决方案 372 9.4.3 工作原理 372 9.5 访问具有复杂XML响应的REST服务 375 9.5.1 问题 375 9.5.2 解决方案 375 9.5.3 工作原理 375 9.6 小结 ...

    Struts2 in action中文版

    8.1.2 实现JSON结果类型 173 8.2 常用的结果类型 180 8.2.1 RequestDispatcher,也叫做dispatcher 180 8.2.2 ServletRedirectResult,也叫做redirect 186 8.2.3 ServletActionRedirectResult,也叫做redirectAction ...

    java开发常用jar包

    一个语言转换工具, Hibernate利用它实现 HQL 到 SQL 的转换模板相关操作需要包 javassist-3.9.0.GA.jar 代码生成工具 Hibernate用它在运行时扩展 Java类和实现,同cglib包 slf4j-api-1.5.8.jar和slf4j-log4j12-...

    spring杂谈 作者zhang KaiTao

    1.11 在spring中获取代理对象代理的目标对象工具类 1.12 如何为spring代理类设置属性值 1.13 我对SpringDAO层支持的总结 1.14 我对SpringDAO层支持的总结 1.15 我对SpringDAO层支持的总结 1.16 我对Spring 容器管理...

    spring-tutorial-elo-rating-system-corvinus

    后端Web应用程序的服务器端组件使用Java和Spring Framework以及...结果类型也可以转换为JSON格式。由于网络性能和信息隐藏,输入和输出JSON消息应表示为Controller中的数据传输对象。控制器还负责验证输入。服务器端

    Spring.3.x企业应用开发实战(完整版).part2

    9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML...

    Spring3.x企业应用开发实战(完整版) part1

    9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML...

    E-BookStore:这是电子商店在线图书市场的服务器端程序,这是在母亲组织的大学EE培训期间的实用Java Web应用程序

    电子商店在线图书市场 这是电子商店在线图书市场的服务器端程序。...Gson(由Google制造)用于Json-Object转换 jQuery和Ajax用于前端和数据传输 用于包管理的Maven Docker-maven-plugin用于远程docker部署 Do

    miaosha:基于springboot + Ajax的商品秒杀项目基础项目(前分离),涉及Springboot,Ajax,redis,mysql,Nginx以及阿里云短信发送服务

    基于springboot + js的商品秒杀项目基础项目(前阶段分离) 开发环境 ...永久层,业务层,控制器层对象转换 Mybatis发电机 用户注册与登录功能 商品查询与增加功能 订单创建功能 密码加密,单独建表 注意

    Java学习笔记-个人整理的

    {13.10}可滚动结果集}{201}{section.13.10} {13.11}Procedure}{201}{section.13.11} {14}xml}{204}{chapter.14} {14.1}元素}{204}{section.14.1} {14.2}XML的设计}{205}{section.14.2} {14.3}DTD/Schema}{205}...

    xmljava系统源码-framework:FUNTL框架

    Hibernate Validate 对 ORM 对象验证 全局的配置类,快速获取 properties 属性文件的键值对 整合 Swagger 快速生成 API 通用的 JSON 数据返回对象 实现 Jaxb2.0 XML &lt;-&gt; Java Object 的互相转换 封装 Jackson ,...

    这是一款特别适用于中小企业应用的JavaEE快速开发框架.zip

    它是居于Spring容器之上,封装了DAO(含Hibernate和MongoDB)操作、多模块统一管理、统一配置管理、统一日志管理等优雅的工程管理开发模型,并提供大量工具包、Json操作、分页辅助工具。 开发工具在软件开发生命...

    dorm:dart orm客户

    例如在Java Hibernate和 :bullseye: 但是并不困难。 实体实现了Observable库,以提供轻松绑定到诸如Polymer之类的框架的功能。 目前,与服务器的通信通过JSON进行,既可以用于发送实体也可以用于接收实体,但是...

    java开源包1

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    lamp-cloud微服务脚手架

    采用Dozer组件来对 DTO、DO、PO等对象的优化转换 11、前后端统一表单验证 严谨的表单验证通常需要 前端+后端同时验证, 但传统的项目,均只能前后端各做一次检验, 后期规则变更,又得前后端同时修改。 故在...

Global site tag (gtag.js) - Google Analytics