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

Jackson @JsonSubType结构校验未触发异常的问题求助

问题描述

我定义了如下Java类:

public class Car{
   String name;
   Short type;
   @JsonTypeInfo(property = "type", include = JsonTypeInfo.As.EXTERNAL_PROPERTY, use = JsonTypeInfo.Id.NAME)
   @JsonSubTypes({
            @JsonSubTypes.Type(value=A.class , name = "1"),
            @JsonSubTypes.Type(value=B.class , name = "2"),
    })
   Object o;
}
public class A{
   String foo;
}
public class B{
   String foo;
   String bar;
}

当传入如下错误结构的JSON时:

{
"name": "John" ,
"type": 1 ,
"o": {
   "foo": "fooValue",
   "bar": "barValue"
}
}

我期望触发Jackson的MismatchedInputException,但并未抛出异常——Jackson将o实例化为A类并设置foo属性值为fooValue,直接忽略了bar字段。我已尝试使用@JsonIgnoreProperties(ignoreUnknown = false)但无效,求解决建议。

解决建议
  • 在子类A上明确配置@JsonIgnoreProperties:将@JsonIgnoreProperties(ignoreUnknown = false)直接添加到A类上,确保Jackson反序列化A实例时,遇到未知字段直接抛出异常。示例:
    @JsonIgnoreProperties(ignoreUnknown = false)
    public class A{
       String foo;
    }
    
  • 全局配置ObjectMapper的失败策略:如果类级注解仍不生效,可全局开启Jackson的未知字段失败配置,覆盖默认的忽略行为。代码示例:
    ObjectMapper mapper = new ObjectMapper();
    // 开启遇到未知字段时抛出异常
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
    
  • 检查Jackson版本并升级:部分旧版本Jackson在处理EXTERNAL_PROPERTY类型的多态注解时,存在未知字段处理逻辑的bug。建议升级到2.13.x及以上的稳定版本,修复潜在的兼容性问题。
  • 验证多态注解的解析逻辑:若上述方法仍无效,可临时将@JsonTypeInfo的include属性改为As.PROPERTY(即将类型标识嵌入o对象内部),测试是否能触发异常,以此排查是否是外部属性解析时的特殊逻辑导致配置失效。

内容的提问来源于stack exchange,提问作者Javad Kargar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:36:33