前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Could not write JSON: No serializer found for 的坑

Could not write JSON: No serializer found for 的坑

作者头像
haoming1100
发布2019-05-08 09:27:46
7K0
发布2019-05-08 09:27:46
举报
文章被收录于专栏:步履前行步履前行

记一次 Could not write JSON: No serializer found for 的坑


今天在返回一个 DTO 实体的时候报错如下:

代码语言:javascript
复制
"message": "Could not write JSON: No serializer found for class com.entity.Question and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.entity.Question and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.common.component.RspDTO[\"data\"]->com.dto.common.PageDTO[\"records\"]->java.util.ArrayList[0])",
  • 在看到上述问题的时候 首先看到的是 No serializer ,因此首先查看 我们的 PageDTO 类,如下类
代码语言:javascript
复制
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 = Collections.emptyList();

    /**
     *  get set 方法忽略
     */
}

可以看到 已经实现了 Serializable 接口,并且有正常的 serialVersionUID 字段 ,所以类没有问题

接着继续查看:

com.common.component.RspDTO["data"]->com.dto.common.PageDTO["records"]->java.util.ArrayList[0])",

发现了如下关键字,所以怀疑是 List 中的 entity 的问题,如下:

代码语言:javascript
复制
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) {
        this.modifiedAt = modifiedAt;
    }

    // 忽略 get  set 方法

BaseEntity 代码如下:

代码语言:javascript
复制
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 接口,查完也没有问题。

那么只能一步步看代码了:

代码语言:javascript
复制
 Page page = this.selectPage(new Page(pageDTO.getCurrent(), pageDTO.getSize()), wrapper);

        pageDTO.setRecords(page.getRecords());

经查明发现出错的 就是 pageDTO.setRecords(page.getRecords());

然后我们手动获取 page.getRecords(),是没有问题的,那么就剩下了 pageDTO.setRecords() 这个方法,执行后发现果然是这里的问题。

问题来了,为什么一个 setList 的方法会出问题呢?

看了下 page.getRecords() 的内容,发现在 Question 中有一个重写了父类的 modifiedAt 字段,在数据库返回的时候给该值赋值成功,但是他还有个 BaseEntity.modifiedAt 的字段,这个值是 null,就是这里引起的问题

最暴力的方法就是 for 循环 然后给该值赋值,这样就序列化成功了,但是这不是我们想要的效果,之后发现是因为在 setList 的时候,没有使用泛型限定值的类型,所以在set的时候就要全部set进去了。所以一个很小的改动就好:

代码语言:javascript
复制
public class PageDTO <T> implements Serializable{

    private List<T> records = Collections.emptyList();

        .
        .
        
}

加入限定修饰,然后在使用的时候

代码语言:javascript
复制
Page<Question> page = this.selectPage(new Page(pageDTO.getCurrent(), pageDTO.getSize()), wrapper);

完美解决


遇到坑不怕,怕的是你不深入就跳过去了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 记一次 Could not write JSON: No serializer found for 的坑
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档