自定义异常类jackson序列化jsonMappingException异常
Posted 好大的月亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义异常类jackson序列化jsonMappingException异常相关的知识,希望对你有一定的参考价值。
遇到一个场景,使用slf4j
记录异常的时候发现一直抛jsonMappingException
@ExceptionHandler({Exception.class, RuntimeException.class})
@ResponseBody
public ClientResult handleException(Exception ex) {
if (ex instanceof CustomSystemException) {
xxxxx
} else {
log.error("System Exception", ex);
return (new ClientResultBuilder()).error(GlobalCodeEnum.ERROR.getCode(), GlobalCodeEnum.ERROR.getMessage()).build();
}
}
tomcat
给我提示是在这一行里面
log.error("System Exception", ex);
乍看之下这个异常打印没啥毛病,问题实际也不是出在这里。
可以看到这个方法返回的是ClientResult
类型的类
在返回给前端的时候springmvc
会利用jackson
序列化成json
后返回,真正的坑就在这里了。
可以看到下面的图中,有2个public的get方法,jackson
在序列化的时候会通过get方法
去获取值,而正好我们这里又是一个code = -1
的业务错误返回,导致jackson
在序列化的时候调用get
方法直接报错了。序列化异常后报了jsonMappingException
。
解决的方案:
- 修改这两个方法代码,不要在序列化的时候抛异常
- 修改方法名,不要用
get
开头
细化分析jackson
序列化
jackson
序列化的时候默认的字段属性发现规则如下:
所有被public
修饰的字段->
所有被public
修饰的getter
->所有被public
修饰的setter
若类中的一个private
属性,且没有设置public
的getter
和setter
方法,则对该类对象进行序列化时,默认不对这个private
属性进行序列化。
若此时任然需要对该private
属性进行序列化,可以通过设置自动检测功能来实现:
@JsonAutoDetect
(作用在类上)来开启/禁止自动检测
- fieldVisibility:字段的可见级别
- ANY:任何级别的字段都可以自动识别
- NONE:所有字段都不可以自动识别
- NON_PRIVATE:非private修饰的字段可以自动识别
- PROTECTED_AND_PUBLIC:被protected和public修饰的字段可以被自动识别
- PUBLIC_ONLY:只有被public修饰的字段才可以被自动识别
- DEFAULT:同PUBLIC_ONLY
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
以上是关于自定义异常类jackson序列化jsonMappingException异常的主要内容,如果未能解决你的问题,请参考以下文章