后台controller返回前台json HttpMessageNotWritableException报错的解决办法

379 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

报错信息如下:

2018-11-12 09:25:14.644  WARN 9416 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: 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); 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)

分析:报错的类==>org.springframework.http.converter.HttpMessageNotWritableException

原因:Could not write JSON: 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);

重点:FAIL_ON_EMPTY_BEANS

那么,显然,json 序列化失败,失败的原因是 返回的类属性里有空值,在数据里查数据发现

确实有空值 则 ,在实体类中加入注解

@JsonSerialize(include=Inclusion.NON_EMPTY) 

当然这个注解可以作为全局注解 放在类上,也可以作为局部注解,放在某个具体字段上 

那么来讲一下@JsonSerialize这个注解的其他作用,在实际开发中,旺旺会有一些意想不到的作用。 比如说在 对应的状态转为文字时,一个一个转比较臃肿,我们就可以用到这个注解进行转换 首先我们新建一个util

public class MySerializerUtils extends JsonSerializer<Integer> {
    @Override
    public void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                 String statusStr = "";
                 switch (status) {
                         case 1:
                                statusStr = "未提交审核";
                                 break;
                         case 2:
                                 statusStr = "已提交审核";
                                 break;
                         case 3:
                                 statusStr = "审核成功";
                                 break;
                         case 4:
                                 statusStr = "审核成失败";
                                 break;
                         default:
                                 statusStr = "审核失败";
                         }
                 jsonGenerator.writeString(statusStr);
    }
}

写好对应的转换值,接下来我们直接使用即可

@Data
public class MessageBo extends TokenBo{

    /**
     * 主键
     */
    private String id;

    /**
     * 消息标题
     */
    private String title;

    /**
     * 消息摘要
     */
    private String summary;

    /**
     * 消息内容
     */
    private String content;

    /**
     * 推送类型
     */
    private Integer pushType;

    /**
     * 推送源 0所有,1 app,2pc
     */
    private List<Integer> pushSourceList;

    /**
     * 推送时间
     */
    private String pushTimeStr;

    /**
     * 是否立即 0 否 1 是
     */
    private Boolean isNow;

    /**
     * 是否已推送 0 否 1 是
     */
    private Boolean isPush;

    /**
     * 消息封面
     */
    private String img;

    /**
     * 创建人
     */
    private String creater;

    /**
     * 修改人
     */
    private String modifyer;

    /**
     * 是否有效 0 关闭 1 开启
     */
    private Boolean status;

    /**
     * 星期几
     */
    private String week;

    /**
     * 消息状态 0草稿 1正常
     */
    private Integer msgStatus;

    @JsonSerialize(using = MySerializerUtils.class)
    private Integer checkStatus;

我们可以看到最后一个属性上使用了@JsonSerialize(using = MySerializerUtils.class) 这个引用,那么就可以直接转换成功。 当然,@JsonSerialize 这个注解还有很多的作用,需要大家自己去发现,比如说时间类型的转换等等。