本文已参与「新人创作礼」活动,一起开启掘金创作之路。
报错信息如下:
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 这个注解还有很多的作用,需要大家自己去发现,比如说时间类型的转换等等。