2

在写学期管理的获取时,写的服务测试之后没有什么问题,却在测试控制器时出现了问题。控制台报了一大堆错误。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.mengyunzhi.schedule.entity.Semester["schedules"]->org.hibernate.collection.internal.PersistentBag[0]->com.mengyunzhi.schedule.entity.Schedu

主要的错就是这个,他说不能序列化json,栈溢出了,是semester["schedules"]不能序列化。

在Semester表中的schedules属性是一个一对多的属性,猜想可能是数据太多了,导致不能序列化

clipboard.png

但在后来测试时把semester里的schedules集合仅仅保存一个对象,再进行测试,还是报了这个错。
打断点debug,在经历种种寻找后找到了这个。
clipboard.png

我发现在查询semester里边有schedules,但schedules里的每个元素里边都有一个semester的对象,并且这个semester的对象跟你要查询的对象还是相同的关系,这样就造成了死循环。

问组长解决办法,组长说可以通过注解在对象序列化为json对象时忽视对象的属性,百度了一下有个@jsonignore的注解,他可以在json序列化时跳过某个属性,大致看了一下,可是使用@jsonignore就固定了对象的json序列化,我想的时根据我的需求不同来序列化不同的属性,然后找到了一个@jsonView的注解。

网上参考了一下,首先就是在你要定义一个接口,再把要序列化的属性前面加上@jsonView的注解,并标识属于的接口名称

clipboard.png

之后在控制器中使用jsonView(类名.接口名.class)就行了

clipboard.png

结果返回的数据就对了。

Body = [{"id":159,"endTime":"1539273600000","name":"ceshi3","startTime":"1538668800000","status":true,"schedules":[{"id":6408,"node":1,"week":1,"weekOrder":1},{"id":6409,"node":2,"week":1,"weekOrder":1},{"id":6410,"node":3,"week":1,"weekOrder":1}]}]

同时也可以继承你定义的接口。
参考链接:https://blog.csdn.net/u012373...


鲸冬香
456 声望27 粉丝