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
相关产品推荐
相关产品推荐

