如何在不修改现有类的前提下禁用@JsonIgnoreProperties忽略校验
解决方案
不需要修改原有类定义,只需构造当前接口专用的ObjectMapper实例,重写注解读取逻辑并开启未知属性校验即可,共有两种落地方式:
方案1:重写注解自省逻辑(推荐)
类上标注的@JsonIgnoreProperties(ignoreUnknown = true)优先级高于全局反序列化配置,因此需要先让Mapper忽略该注解的配置,再开启未知属性报错开关:
// 构造当前接口专用的ObjectMapper,不要复用全局实例避免影响其他业务 ObjectMapper strictMapper = new ObjectMapper(); // 开启未知属性触发反序列化失败的配置 strictMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true); // 重写注解解析逻辑,忽略所有类上的@JsonIgnoreProperties配置 strictMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() { @Override public JsonIgnoreProperties findIgnoreProperties(Annotated ann) { return null; } });
在switch case分支中使用这个strictMapper做Map到子类实例的转换即可,一旦请求携带未定义的属性,会直接抛出JsonMappingException,你可以捕获该异常返回参数错误响应。
方案2:使用Jackson Mixin机制
如果不想自定义注解解析器,也可以用Mixin动态覆盖原有类的注解配置:
- 定义一个空的Mixin接口,显式关闭未知属性忽略:
@JsonIgnoreProperties(ignoreUnknown = false) public interface StrictCheckMixin {}
- 给专用Mapper绑定Mixin到基类,所有继承基类的子类都会自动继承该配置:
ObjectMapper strictMapper = new ObjectMapper(); strictMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true); // 绑定Mixin到基类,动态覆盖原有注解配置,替换为你自己的基类全限定名 strictMapper.addMixIn(YourBaseClass.class, StrictCheckMixin.class);
该方案的优势是可以精准控制要覆盖的类范围,不会影响Mapper对其他类的反序列化逻辑。
内容的提问来源于stack exchange,提问作者N.Rajal
相关产品推荐
相关产品推荐

