如何配置Jackson ObjectMapper在传入值为"null"的JSON字符串时抛出异常
问题说明
- 需求:配置Jackson的
ObjectMapper,当待反序列化的整个字符串内容为JSON字面量"null"时,直接抛出反序列化异常,而非默认返回null - 现有问题:执行
objectMapper.readValue("null", MyModel.class);时直接返回null,已添加的三项配置未生效:
.configure(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES, true) .configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true) .configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true);
原因说明
之前配置的三个参数都不针对「根节点为null字面量」的场景,自然不生效:
FAIL_ON_NULL_CREATOR_PROPERTIES:仅校验@JsonCreator标注的构造方法/工厂方法的入参不能为nullFAIL_ON_NULL_FOR_PRIMITIVES:仅当尝试把null反序列化为int/long/boolean这类基本数据类型(非包装类)时才抛错,自定义POJO类型不触发FAIL_ON_MISSING_CREATOR_PROPERTIES:仅校验构造器必填参数缺失的场景,和根节点是否为null无关
解决方案
方案1:Jackson 2.12+ 版本原生配置
直接通过强制类型转换配置,指定所有POJO类型遇到null字面量时直接失败:
// 需导入类:com.fasterxml.jackson.databind.type.LogicalType、com.fasterxml.jackson.databind.cfg.CoercionInputShape、com.fasterxml.jackson.databind.cfg.CoercionAction objectMapper.coercionConfigFor(LogicalType.POJO) .setCoercion(CoercionInputShape.NullLiteral, CoercionAction.Fail);
配置完成后再调用objectMapper.readValue("null", MyModel.class)会直接抛出JsonMappingException。
注意:该配置全局生效,不仅拦截根级null,也会在POJO属性传入null值时抛错,如果仅需要拦截整个输入为null的场景,建议使用方案2。
方案2:全版本兼容实现(更灵活)
如果需要仅拦截根节点为null的场景、允许POJO属性正常传null,或者使用2.12以下的低版本Jackson,可以先解析树节点做判断再转换:
public <T> T readValueStrict(String content, Class<T> valueType) throws JsonProcessingException { JsonNode rootNode = objectMapper.readTree(content); if (rootNode.isNull()) { throw new JsonMappingException("Root content cannot be null literal"); } return objectMapper.treeToValue(rootNode, valueType); } // 调用示例:传入"null"时会直接抛出异常 MyModel result = readValueStrict("null", MyModel.class);
内容的提问来源于stack exchange,提问作者herdsothom
相关产品推荐
相关产品推荐

