CouldnotwriteJSON:Noserializerfoundfor的坑
记⼀次 Could not write JSON: No serializer found for 的坑
今天在返回⼀个 DTO 实体的时候报错如下:
"message": "Could not write JSON: No serializer found for ity.Question and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fa 在看到上述问题的时候⾸先看到的是 No serializer ,因此⾸先查看我们的 PageDTO 类,如下类
public class PageDTO implements Serializable {
private static final long serialVersionUID = -7254888630210798460L;
/**
* 每页显⽰条数,默认 10
*/
private Integer size;
/**
* 当前页
*/
private Integer current;
private Long total;
/**
* 是否为升序 ASC(默认: true )
*/
private Boolean isAsc;
private Map<String, String> condition;
private List records = ptyList();
/**
*  get set ⽅法忽略
*/
}
可以看到已经实现了 Serializable 接⼝,并且有正常的 serialVersionUID 字段,所以类没有问题
接着继续查看:
commonponent.RspDTO["data"]->com.dtomon.PageDTO["records"]->java.util.ArrayList[0])",
发现了如下关键字,所以怀疑是 List 中的 entity 的问题,如下:
public class Question extends BaseEntity {
private static final long serialVersionUID = 1L;
private Long id;
private Integer grade;
private Integer subject;
@Version
private Date modifiedAt;
@Override
public Date getModifiedAt() {
return modifiedAt;
}
@Override
public void setModifiedAt(Date modifiedAt) {
}
// 忽略 get  set ⽅法
BaseEntity 代码如下:
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
private Integer isDel;
private Long creatorId;
private Date createdAt;
private Long modifierId;
private Date modifiedAt;
Question 类继承了 BaseEntity 并且实现了 Serializable 接⼝,查完也没有问题。
那么只能⼀步步看代码了:
Page page = this.selectPage(new Current(), Size()), wrapper);
pageDTO.Records());
经查明发现出错的就是 pageDTO.Records());
博客为什么没人用了然后我们⼿动获取 Records(),是没有问题的,那么就剩下了 pageDTO.setRecords() 这个⽅法,执⾏后发现果然是这⾥的问题。
问题来了,为什么⼀个 setList 的⽅法会出问题呢?
看了下 Records() 的内容,发现在 Question 中有⼀个重写了⽗类的 modifiedAt 字段,在数据库返回的时候给该值赋值成功,但是他还有个difiedAt 的字
段,这个值是 null,就是这⾥引起的问题
最暴⼒的⽅法就是 for 循环然后给该值赋值,这样就序列化成功了,但是这不是我们想要的效果,之后
发现是因为在 setList 的时候,没有使⽤泛型限定值的类型,所以在set的
时候就要全部set进去了。所以⼀个很⼩的改动就好:
public class PageDTO <T> implements Serializable{
private List<T> records = ptyList();
.
.
加⼊限定修饰,然后在使⽤的时候
Page<Question> page = this.selectPage(new Current(), Size()), wrapper);完美解决
遇到坑不怕,怕的是你不深⼊就跳过去了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。