You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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标注的构造方法/工厂方法的入参不能为null
  • FAIL_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:45:44