自定义异常类jackson序列化jsonmappingexception异常(代码片段)

好大的月亮 好大的月亮     2022-12-24     308

关键词:

遇到一个场景,使用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

解决的方案:

  1. 修改这两个方法代码,不要在序列化的时候抛异常
  2. 修改方法名,不要用get开头

细化分析jackson序列化

jackson序列化的时候默认的字段属性发现规则如下:

所有被public修饰的字段->所有被public修饰的getter->所有被public修饰的setter

若类中的一个private属性,且没有设置publicgettersetter方法,则对该类对象进行序列化时,默认不对这个private属性进行序列化。

若此时任然需要对该private属性进行序列化,可以通过设置自动检测功能来实现:
@JsonAutoDetect(作用在类上)来开启/禁止自动检测

  1. fieldVisibility:字段的可见级别
  2. ANY:任何级别的字段都可以自动识别
  3. NONE:所有字段都不可以自动识别
  4. NON_PRIVATE:非private修饰的字段可以自动识别
  5. PROTECTED_AND_PUBLIC:被protected和public修饰的字段可以被自动识别
  6. PUBLIC_ONLY:只有被public修饰的字段才可以被自动识别
  7. DEFAULT:同PUBLIC_ONLY
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

如何在 Jackson 中使用自定义序列化程序?

】如何在Jackson中使用自定义序列化程序?【英文标题】:HowdoIuseacustomSerializerwithJackson?【发布时间】:2011-11-0123:06:02【问题描述】:我有两个Java类,我想使用Jackson序列化为JSON:publicclassUserpublicfinalintid;publicfinalStringname;publicUser(i... 查看详情

利用jackson序列化实现数据脱敏

...下jackson的@JsonSerialize注解。@JsonSerialize是jackson提供自定义序列化方法的注解,它有个using属性,指定自定义序列化的执行类;例如:先自定义一个序列化类@JsonSerialize注解的Java类示例我们知道,springMVC是通过jackson这个序列化框架... 查看详情

尝试使用自定义 JsonSerializer (Jackson) 时出现 *** 异常

】尝试使用自定义JsonSerializer(Jackson)时出现***异常【英文标题】:***exceptionwhentryingtousecustomJsonSerializer(Jackson)【发布时间】:2018-05-2100:58:08【问题描述】:我正在尝试使用Jackson将对象序列化为JSON,以便字段名称基于字段类型。我... 查看详情

json之jackson的常用全局配置以及自定义序列化规则

参考技术A不配置使用Java8的数据类型(比如:LocalDateTime)会报以下异常配置3.结果 查看详情

使用自定义消息捕获和处理 Jackson 异常

】使用自定义消息捕获和处理Jackson异常【英文标题】:Catching&HandlingJacksonExceptionswithacustommessage【发布时间】:2019-01-0207:14:11【问题描述】:我希望能捕捉到我正在开发的spring-bootAPI中发生的一些jackson异常。例如,我有以下请... 查看详情

一文详解jackson配置信息

参考技术ASpringBoot在处理对象的序列化和反序列化时,默认使用框架自带的JackSon配置。使用框架默认的,通常会面临如下问题:针对上述问题,存在很多种解决方案。由于底层框架统一配置拦截类实现的模式不同,还是会存在差... 查看详情

@jsonserialize(代码片段)

文章目录使用自定义序列化类实体标注注解此注解用于属性或者getter方法上,用于在序列化时嵌入开发者自定义的代码。比如将一个Date类型的变量转换成Long类型,或是序列化一个double时在其后面限制两位小数点。使用自定义序... 查看详情

库中的自定义 Jackson 序列化

】库中的自定义Jackson序列化【英文标题】:CustomJacksonserializationinlibrary【发布时间】:2017-09-0406:23:24【问题描述】:我正在编写一个Spring启动应用程序,它使用RestController来公开一个资源。唯一的资源MainResource是这样的:Stringid;S... 查看详情

当值为“null”时,Jackson 忽略自定义字段反序列化器

】当值为“null”时,Jackson忽略自定义字段反序列化器【英文标题】:JacksonIgnoresCustomFieldDeserializerWhenValueis"null"【发布时间】:2017-12-1303:25:16【问题描述】:我为某个领域的Jackson编写了一个自定义反序列化器(如下)。... 查看详情

Spring Boot 1.4 自定义内部 Jackson 反序列化

】SpringBoot1.4自定义内部Jackson反序列化【英文标题】:SpringBoot1.4CustomizeInternalJacksonDeserialization【发布时间】:2017-08-1000:08:10【问题描述】:我在application.properties中使用spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true使反序列化在... 查看详情

Spring Boot - 自定义 JsonDeserializer 被忽略

...021-05-1303:18:18【问题描述】:我正在尝试将自定义Jackson反序列化器(类“com.fasterxml.jackson.databind.JsonDeserializer”)应用于需要自定义反序列化的第三方库中的bean。我的自定义反序列 查看详情

jackson中自定义处理序列化和反序列化

...了,但还是得小结下了:先来看下如何自定义把某个对象序列化为json:先是对象:Java代码 publicclassUser{publicintid;publi 查看详情

如何使具有多个 init args 的自定义异常类可腌制

...】:为什么我下面的自定义异常类没有使用pickle模块正确序列化/反序列化?importpickleclassMyException(Exception):def__init__(self,ar 查看详情

jackson注解自定义数据脱敏策略(代码片段)

...1.前言2.脱敏注解3.定义好一套需要脱敏的规则4.自定义JSON序列化5.在实体类上标注对应的脱敏规则5.写一个接口进行测试1.前言有时候,我们返回给前端的数据需要脱敏,避免用户信息被泄漏,就像你点外卖一样,... 查看详情

使用 Jackson 自定义反序列化:扩展默认反序列化器

】使用Jackson自定义反序列化:扩展默认反序列化器【英文标题】:CustomdeserializationwithJackson:extenddefaultdeserializer【发布时间】:2018-07-1503:00:54【问题描述】:我想通过扩展默认值并在其后设置更多值来制作自己的反序列化器:simp... 查看详情

Jackson 使用自定义日期格式错误地反序列化 Joda 日期

】Jackson使用自定义日期格式错误地反序列化Joda日期【英文标题】:JacksonincorrectlydeserializeJodadateswithcustomdateformat【发布时间】:2016-02-1818:48:54【问题描述】:我正在尝试使用自定义日期格式序列化和反序列化非常简单的对象:pub... 查看详情

Jackson - 自定义反序列化器不会读取 JSON 中的所有字段

】Jackson-自定义反序列化器不会读取JSON中的所有字段【英文标题】:Jackson-CustomDeserializerdoesn\'treadallthefieldsinJSON【发布时间】:2020-04-3013:07:09【问题描述】:我从API接收到这个JSON:"link":[],"firstRecord":1,"item":["Customer":"id":"1058207","fi... 查看详情

java示例代码_Jackson-如何基于json内容应用自定义反序列化

java示例代码_Jackson-如何基于json内容应用自定义反序列化 查看详情