Jackson序列化反序列化null字段调用booleanValue()报错如何配置解决
问题报错
com.fasterxml.jackson.databind.JsonMappingException: Cannot invoke "java.lang.Boolean.booleanValue()" because "this.flag" is null
异常触发逻辑为Jackson做序列化/反序列化操作时,尝试将值为null的Boolean包装类型拆箱为基本类型boolean,触发空指针。场景中待处理对象包含protected Serializable data字段,字段实际运行时类型不固定,要求仅通过ObjectMapper配置解决问题,不修改业务代码、不添加类注解,适配大量存量类的处理需求。
当前已有ObjectMapper配置如下:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(objectMapper.getSerializationConfig().getDefaultVisibilityChecker() .withFieldVisibility(JsonAutoDetect.Visibility.ANY) .withGetterVisibility(JsonAutoDetect.Visibility.NONE) .withSetterVisibility(JsonAutoDetect.Visibility.NONE) .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
解决配置
在原有配置基础上追加以下全局配置即可,无需改动任何业务代码:
// 反序列化场景:关闭null值转基本类型的报错逻辑,不强制触发拆箱操作 objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false); // 针对Boolean类型做全局空值处理:遇到null值直接赋值/序列化null,不调用拆箱方法 objectMapper.configOverride(Boolean.class) .setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));
配置说明
- 配置全局生效,覆盖所有序列化、反序列化场景,不需要给数百个业务类单独加注解或修改字段定义
- 配置生效后,Boolean类型的null值序列化时正常输出
null,反序列化时遇到对应null值直接赋值为null,不会触发.booleanValue()方法调用 - 对于声明为
Serializable的宽泛类型字段,Jackson运行时识别到实际存储值为null的Boolean实例时,会直接走上述全局配置逻辑,不会触发空指针异常 - 上述配置在Jackson 2.6及以上版本均可正常使用,不需要额外引入第三方依赖
内容的提问来源于stack exchange,提问作者FIKI
相关产品推荐
相关产品推荐

