Hibernate懒加载导致json数据对象传输异常的问题---(非常重要)
1. 异常:
[console_demo][WARN] [2016-12-15 19:49:35] org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable(407) | Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could
not write content: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain:
java.util.HashMap["ckRequirePartLists"]->java.util.ArrayList[0]->com.dyoon.cmms.pojo.CkRequirePartList["ckPurchaseBill"]->com.dyoon.cmms.pojo.CkPurchaseBill["applyOperator"]->com.dyoon.cmms.pojo.UserOperator_
_jvsta2a_8["userModifyLog"]->com.dyoon.cmms.pojo.UserModifyLog_
nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
(through reference chain: java.util.HashMap["ckRequirePartLists"]->java.util.ArrayList[0]->com.dyoon.cmms.pojo.CkRequirePartList["ckPurchaseBill"]->com.dyoon.cmms.pojo.CkPurchaseBill["applyOperator"]->com.dyoon.cmms.pojo.UserOperator__jvsta2a_6["handler"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["ckRequirePartLists"]->java.util.ArrayList[0]->com.dyoon.cmms.pojo.CkRequirePartList["ckPurchaseBill"]->com.dyoon.cmms.pojo.CkPurchaseBill["applyOperator"]->com.dyoon.cmms.pojo.UserOperator_
_jvsta2a_12["sysRole"]->com.dyoon.cmms.pojo.SysRole_
_jvsta2a_6["handler"])
2. 原因:
使用注解@ResponseBody返回由Hibernate DAO直接获得的pojo对象内存在Lazy关联对象,执行Jason转换时,会从数据库加载该对象,而此时session已关闭,导致加载失败,进而导致Jason转换失败。
3 解决:
方法一:在不影响数据完整性的情况下,使用set方法手动置空pojo类的Lazy关联对象。(这样如果关联的对象比较多,可能漏的。)
方法二:使用@JsonIgnore注释掉pojo类的Lazy关联对象。(这种如果在其他的地方需要用关联的对象转json,这样就会导致失效。)
方法三:自定义类,二次封装所需的pojo对象的属性。
4. 事例:以下对第三种方法做展示
jsp页面:
-
function showPartDetails(purchBillId){
-
-
$.ajax({
-
type:"post",
-
url:"${rootPath }/depot/purchase/getPartByPurchBillId?purchBillId="+purchBillId,
-
success : function(data){
-
alert(data.requirePartListBeans[0].partName);
-
}
-
});
-
}
通过ajax发送请求到controller,服务器处理结果,将结果以json的格式发送给前端。
常规下的controller如下:
-
@RequestMapping(value = "/getPartByPurchBillId")
-
@ResponseBody
-
public Map<String,Object> getPartByPurchBillId(@RequestParam(value="purchBillId") Integer purchBillId) throws JsonProcessingException {
-
Map<String, Object> map = new HashMap<>();
-
List<CkRequirePartList> ckRequirePartLists = purchaseService.getPartByPurchBillId(purchBillId);
-
map.put("requirePartListBeans", ckRequirePartLists);
-
return map;
-
}
但是由于hibernate懒加载的问题,requirePartListBeans不能正常的转换为json,这时候将前端要获取的属性数据封装成一个类,以下为假如前端要获取的3条数据:
-
public class RequirePartListBean {
-
-
private String partNumber;
-
private String partName;
-
private BigDecimal partQuantity;
-
-
public String getPartNumber() {
-
return partNumber;
-
}
-
-
public void setPartNumber(String partNumber) {
-
this.partNumber = partNumber;
-
}
-
-
public String getPartName() {
-
return partName;
-
}
-
-
public void setPartName(String partName) {
-
this.partName = partName;
-
}
-
-
public BigDecimal getPartQuantity() {
-
return partQuantity;
-
}
-
-
public void setPartQuantity(BigDecimal partQuantity) {
-
this.partQuantity = partQuantity;
-
}
-
}
更改后的controller为:
-
@RequestMapping(value = "/getPartByPurchBillId")
-
@ResponseBody
-
public Map<String,Object> getPartByPurchBillId(@RequestParam(value="purchBillId") Integer purchBillId) throws JsonProcessingException {
-
Map<String, Object> map = new HashMap<>();
-
List<CkRequirePartList> ckRequirePartLists = purchaseService.getPartByPurchBillId(purchBillId);
-
RequirePartListBean r = null;
-
List<RequirePartListBean> requirePartListBeans = new ArrayList<>();
-
for (CkRequirePartList ckRequirePartList : ckRequirePartLists) {
-
r = new RequirePartListBean();
-
r.setPartName(ckRequirePartList.getModPartCatalog().getPartName());
-
r.setPartNumber(ckRequirePartList.getModPartCatalog().getPartNumber());
-
r.setPartQuantity(ckRequirePartList.getPartQuantity());
-
requirePartListBeans.add(r);
-
}
-
map.put("requirePartListBeans", requirePartListBeans);
-
return map;
-
}
前端ajax通过success响应数据,
-
success : function(data){
-
alert(data.requirePartListBeans[0].partName);
-
}
至此,问题得到解决。还有问题的可以留言。
原文地址:https://blog.csdn.net/baidu_28283827/article/details/53675121
Hibernate懒加载导致json数据对象传输异常的问题---(非常重要)的更多相关文章
- hibernate懒加载和json序列化冲突
因为懒加载这个对象属性只是一个代理对象,如果json直接当作一个存在的属性去序列化就会出现错误,所以就只能这样了,当然还有其他办法吧 或者在class上加上 @JsonIgnoreProperties ...
- hibernate懒加载导致jackjson解析json时StackOverFlow
@JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties jackson中的@Jso ...
- -java转json hibernate懒加载造成的无限递归问题
1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...
- hibernate懒加载(转载)
http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...
- ssh中Hibernate懒加载,session问题的学习与理解
交代本项目中要求获取session的方式如下: public Session getCurrentSession() { // 增删改使用的session,事务必须是开启的(Required,即pro ...
- Hibernate懒加载深入分析
Hibernate懒加载深入分析 懒加载可以提高性能吗? 不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越. ...
- web进修之—Hibernate 懒加载(6)
关于懒加载 在关系数据库设计的时候,我们很多时候把表之间的关系设置为强关联(使用外键进行约束),在Hibernate中利用对象的包含关系进行维护(HIbernate本身就是面向对象的数据库操作模式), ...
- Hibernate懒加载解析
Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...
- hibernate懒加载
Hibernate懒加载解析 hibernatejoinsession数据库sqlobject Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适 ...
随机推荐
- python 索引上的合并
- 2019阿里云开年Hi购季基础云产品分会场全攻略!
2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...
- js面向对象开发基础
js的面向对象开发能力较弱,基本是以prototype为核心的面向对象,虽然现在出了个class这玩意,但本文还是先不做探讨. 面向对象基础——构造函数方法 var Fly = function (s ...
- 【JZOJ5081】【GDSOI2017第三轮模拟】Travel Plan 背包问题+双指针+树的dfs序
题面 100 注意到ban的只会是一个子树,所以我们把原树转化为dfs序列. 然后题目就转化为,询问一段ban的区间,之后的背包问题. 比赛的时候,我想到这里,于是就开始想区间合并,于是搞了线段树合并 ...
- SDUT-3399_数据结构实验之排序二:交换排序
数据结构实验之排序二:交换排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 冒泡排序和快速排序都是基于"交 ...
- 洛谷P1316 P1824
P1316 丢瓶盖 题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以 ...
- golang之常量
1. 常量可以是全局常量,也可以是函数内部的局部常量.常量的值不可修改,常量表达式的值在编译期计算,而不是在运行期.存储在常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型.当 ...
- 在maven多模块结构中,并且使用overlay的情况下使用jetty热部署
在使用maven多模块的结构的时候,同时有多个web工程使用maven-war-plugin的overlay来组织的时候,本地开发时如何在eclipse里面启动容器并且可以热部署调试是个比较麻烦的问题 ...
- Bootstrap —— tab切换
tab切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 【JZOJ3852】【NOIP2014八校联考第2场第2试9.28】单词接龙(words)
DDD Bsny从字典挑出N个单词,并设计了接龙游戏,只要一个单词的最后两个字母和另一个单词的前两个字母相同,那么这两个单词就可以有序的连接起来. Bsny想要知道在所给的所有单词中能否按照上述方式接 ...