springmvc使用jackson转json解决双向关联关系(例如一对多)循环调用。目前只是避开了循环调用,并不是真正的从根本上解决。就算用ObjectMapper Hibernate4Module也是解决懒加载转json的问题。
问题简说
实体类:老师Teacher.java
@OneToMany(fetch= FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="teacher_id")
public Set<Student> getStudents() {
return students;
}
实体类:学生Student.java
@ManyToOne
@JoinColumn(name="teacher_id")
public Teacher getTeacher() {
return teacher;
}
服务层:学生服务层StudentServiceImpl.java
@Override
@Transactional(readOnly = true)
public Student findById(Long id){
Student student = studentRepository.findOne(id);
//模拟用到了关联数据,或者使用了自动映射复制到vo、dto等等
Teacher teacher = student.getTeacher();
Set<Student> students = teacher.getStudents();
System.out.println(students);
return student;
}
控制层:返回json数据到前台
@RequestMapping(value = "/find", method = RequestMethod.GET)
@ResponseBody
public Student find(HttpServletRequest request, HttpServletResponse response){
Student student = studentService.findById(1L);
return student;
}
由于hibernate双向关联关系,查出来的实体对象返回前台输出json,会循环嵌套。如:
{"id":1,"name":"Student-1","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":[{"id":2,"name":"Student-2","teacher":{"id":1,"name":"Teacher","students":...
......
......
解决方法
1、最简单的办法
在返回的时候吧循环嵌套设置为空,或mapping转vo,dto的时候过滤该字段。
缺点:对象复杂时比较麻烦,用mapper复制对象又要考虑过滤字段操作。
Student student = studentRepository.findOne(id);
Teacher teacher = student.getTeacher();
teacher.setStudents(null);
return student;
输出:
{"id":1,"name":"Student-1","teacher":{"id":1,"name":"Teacher","students":null}}
2、springmvc返回jackson注解处理
@JsonBackReference:
标记在子类对父类的引用变量上,标注的属性在将对象转换为json数据时,会被忽略。
它的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。
@JsonManagedReference:
标记在父类对子类的引用变量上,标注的属性在被对象转换为json数据时,不会被忽略。
如果没有它在json数据转换为对象时,不会注入@JsonBackReference标记属性。
@JsonIgnore:
直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。
缺点:学生类找不到老师类的ID了,整个属性都被忽略掉了,如果需要,要另外起属性定义赋值如return teacher.getId();
用户类(子)多的一端
@JsonBackReference
private Teacher teacher;
老师类(父)一的一端
@JsonManagedReference
private Set<Student> students;
输出:
{"id":1,"name":"Student-1"}
后面如果发现有更好的办法再补上。
原创文章,转载请注明出处:https://www.weizhixi.com/article/64.html
springmvc接收参数异常application/json not supported
纲要1、解决:HTTP媒体类型不支持异常,HttpMediaTypeNotSupportedException: Content type 'appli...
springmvc4解决异常ReflectionWorldException
新建项目过程中,肯定遇到一点异常。下面来看看这个异常:java.lang.ClassNotFoundException: org.aspectj.weaver....
如何搭建一个多模块分布式maven项目
maven搭建项目使用方便,灵活性高,自动依赖,使项目高内聚,低耦合,轻松编译、打包、部署等等。我的环境InteIIiJ IDEA 2016.1maven 3....
api接口签名加密请求,从springmvc4项目搭建开始
本文一步一步教你如何实现简单API接口请求。很多业务需要用到简单的api接口请求。通俗的说,例如客户端,客户端不做逻辑处理,只是简单的发起业务请求完成操作。复杂...
springmvc3+hibernate4入门配置
最近比较忙,电脑的桌面也比较乱了,在整理电脑桌面文件的时候,无意看到了以前学习时候的第一次写的springmvc例子,觉得挺适合新手入门的。在这里分享下配置吧,...
java UTC时间格式化 时间带T Z
(58262)
最近在调用一个国外的网站api,返回的json数据格式的时间如 2018-01-31T14:32:19Z 。时间字符串带T和Z。这时候需要根据业务来确认你是否要...
iphone如何使用imovie编辑竖屏视频
(10464)
iphone自带的iMovie剪辑app很好用,而且功能强大。无论是合拼视频过度、放慢、添加多首音乐自由合辑等。但发现导出的视频都是类似正方形的很小,竖屏的视频...
springmvc接收参数异常application/json not supported
(9276)
纲要1、解决:HTTP媒体类型不支持异常,HttpMediaTypeNotSupportedException: Content type 'appli...
如何将idea自带的maven添加到环境变量
(7465)
想要通过命令形式在cmd操作IntelliJ IDEA自带的maven,那么就必须配置idea的maven环境变量。下面以window 10 和 idea 20...
java初探Tess4j识别图片文字
(7027)
想学习下识别图片中的文字,找到了Tess4j图文识别的方式,于是就初步探究下,玩下识别验证码。第一步,下载1、以3.4.2版本为例,下载Tess4j-3.4.2...
java php js AES加密解密相互通用工具类例子
(887)
有空之余整理了一份java、php和javascript的AES互相通用的加密解密工具类。AES算法加密和解密有几种加密模式,以下例子使用128位密钥长度CBC模式演示。AES属于对称加密算法...
解决Imagick和GS将PDF转成JPG图片异常及例子
(1031)
本想简单的将PDF转JPG,可是网上在线转不太安全,某些PDF阅读器又都要收费,那只好用代码将pdf转成图片,自己动手丰衣足食。在PHP中使用Imagick将PDF转JPG/PNG等图片时遇到...
解决IOS设备浏览器返回或前进时从无法执行某操作
(356)
发现在ios设备浏览器中返回上一个页面是从浏览器缓存中读取的,在跳转到另一个页面前的一些操作,如“加载中”,在另一个页面点击返回时“加载中”状态依然存在,相应js并没...
Ueditor 百度编辑器利用视频插件上传音频
(517)
百度编辑器Ueditor怎么利用视频插件上传音频呢,编辑器的上传视频插件也有mp3等音频格式上传,但是上传后的标签是video,这并不是我们想要的效果,我们想要是视频用video标...
php文件目录列表转成tree状
(416)
文件目录列表如何转成tree状,即格式化文件目录列表,获得具有父子级关系数据后,再转成tree装数据结构。目录列表转父子关系数据/** * 格式化文件目录列表,使得数据具有父...