在使用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的代理对象的数据取出来,转化为普通对应对象。结果还好,成功了。但是性能未进行测试,个人认为反射不会带来性能的损失。现在代码贴出来,大家拍砖,分析哪方面需要改进。
目前只能支持一级抓取。
/**
*
* 功能描述: 解决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 —— 数据库结果集转换”,这主要涉及到将数据库查询结果转化为JSON格式的数据,以便于在网络传输中使用。在现代Web开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换...
以上知识点,不仅包括了将List集合转换为JSON对象的基本方法,还涉及到了在实际开发中可能遇到的问题及其解决方法,包括对特定框架和库的使用,对敏感数据的过滤等。掌握了这些知识点,对于进行Web开发和数据交换的...
本文将深入探讨Jackson作为JSON转换工具的关键知识点,并基于提供的博文链接进行补充。 1. **Jackson库介绍** Jackson是一个开源项目,其核心库为`com.fasterxml.jackson.core`,包括`jackson-databind`、`jackson...
1. **对象到JSON转换**:你可以通过`net.sf.json.JSONObject`类的静态方法`fromObject()`将Java对象转换为JSON对象。例如,如果你有一个`User`对象,可以这样转换: ```java User user = new User(); // 设置user...
在JSON转换过程中,它可能用于辅助数据结构的处理,比如遍历、过滤或者转换List。 4. **commons-lang-2.6.jar**:Apache Commons Lang是一个包含大量实用工具方法的Java类库,用于补充Java的标准库。在List到JSON的...
2. **转换功能**:json-lib可以将Java对象(如ArrayList、HashMap)直接转换为JSON格式,也可以将JSON字符串解析成对应的Java对象。 3. **与其他技术的集成**:json-lib也支持与Hibernate、Struts、Spring等框架的...
在Struts2中,可以通过Json插件将Java对象转换为Json格式,然后发送给前端。JQuery可以方便地解析这个Json响应,更新页面元素。 至于"Test3List"这个文件,可能是测试用例或者表示三级联动中每一级的数据列表。这...
5. 验证结果返回给Struts2,Struts2将其转换为JSON格式的响应。 6. ExtJS接收到响应,解析JSON数据,根据返回状态更新UI,如显示登录成功或错误信息。 这个登录程序示例涵盖了Web开发中前端与后端的典型交互方式,...
"json-lib-2.4-ALL.rar"是一个包含JSON库的压缩文件,JSON Lib是一个Java库,用于在Java对象和JSON数据之间进行转换,它是Struts2实现JSON支持的一个依赖库。 在Struts2中使用JSON,首先需要在配置文件(struts.xml...
3. **ObjectMapper**:这是Jackson最强大的组件,它将JSON和Java对象之间转换的工作自动化。ObjectMapper可以将Java对象序列化为JSON字符串,也可以将JSON字符串反序列化为Java对象。它还支持类型映射,允许在不同类...
它们各自负责不同的职责:Struts2.0主要处理MVC(Model-View-Controller)架构中的视图和控制层,Spring是一个全面的后端解决方案,包括依赖注入、事务管理、AOP等,而Hibernate则是一个优秀的对象关系映射(ORM)...
选择一个合适的库,用于将Java对象转换为JSON字符串,并从JSON字符串反序列化回Java对象。 3. **序列化和反序列化**:在`nullSafeGet()`方法中,你需要从ResultSet获取JSON字符串,然后使用选定的JSON库将其反序列...
4. **返回JSON数据**:在Action的方法执行完毕后,由于配置了`json`结果类型,Struts2会自动将Action的属性转换为JSON格式并返回给客户端。如果需要自定义JSON输出,可以通过`@ResultType`注解指定特定的JSON结果...
这个库提供了将Java对象转换为JSON字符串,以及从JSON字符串反序列化回Java对象的功能。JSON对象由键值对组成,数组以方括号表示,对象以花括号表示,数据类型包括字符串、数字、布尔值、数组、对象和null。 在Java...
当我们将Java对象转换为JSON格式时,有时我们可能需要忽略某些特定属性,特别是子对象的特定属性。本文将详细讲解如何使用Jackson来实现这一功能。 首先,Jackson提供了一个`@JsonIgnoreProperties`注解,用于忽略...
本文将深入探讨Jackson框架在JSON转换中的各种方法,帮助你更好地理解和应用这个强大的工具。 1. JSON到Java对象 Jackson的核心API包括`ObjectMapper`,它是进行类型转换的主要类。你可以使用`readValue()`方法将...
`json-lib-2.4-jdk15.jar`是Json-lib库的一个版本,它是一个Java API,提供了将Java对象转换为JSON格式和从JSON反序列化回Java对象的功能。Json-lib支持多种Java类库,包括Hibernate、JavaBeans、JDOM、Jakarta ...
它能够将Java集合、JDBC结果集、JavaBean、POJO等对象转换为JSON格式,同时也可以将JSON文本转换回Java对象。json-lib支持多种流行的数据模型,如Apache Commons BeanUtils、Google Guava、Hibernate等。 在Java...
1. Jackson:这是一个高效的JSON处理库,提供了一套完整的解决方案,包括`com.fasterxml.jackson.databind.ObjectMapper`类,用于将Java对象转换为JSON字符串和反向转换。Jackson还支持JSON Schema验证和流式API,...