Spring Boot请求体DTO严格验证异常未抛出问题排查
你遇到的问题核心在于Spring Boot默认关闭了Jackson的FAIL_ON_UNKNOWN_PROPERTIES反序列化特性,导致你在Resource类上标注的@JsonIgnoreProperties(ignoreUnknown = false)无法触发未知属性的异常。
原因详解
Jackson的FAIL_ON_UNKNOWN_PROPERTIES特性用于控制反序列化时遇到未知属性是否抛出异常,而Spring Boot出于兼容性考虑,默认将该特性设置为false(即忽略未知属性,不抛出异常)。此时,即使你在类级别标注@JsonIgnoreProperties(ignoreUnknown = false),由于全局开关未开启,Jackson不会执行未知属性的检查逻辑,自然不会抛出异常。
解决方法
方法1:全局开启未知属性检查(推荐)
在Spring Boot的配置文件中添加以下配置,全局开启Jackson的未知属性检查:
如果使用application.properties:
spring.jackson.deserialization.fail-on-unknown-properties=true
如果使用application.yml:
spring: jackson: deserialization: fail-on-unknown-properties: true
开启后,所有通过@RequestBody反序列化的类都会检查未知属性并抛出异常。如果你需要让某个类忽略未知属性,只需在该类上标注@JsonIgnoreProperties(ignoreUnknown = true)即可覆盖全局配置。
方法2:仅针对特定类开启检查(进阶)
如果你不想全局开启,只想让Resource类触发未知属性异常,可以自定义ObjectMapper并为该类单独配置:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 全局默认关闭未知属性检查 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 为Resource类单独开启检查 objectMapper.addMixIn(Resource.class, ResourceMixIn.class); return objectMapper; } @JsonIgnoreProperties(ignoreUnknown = false) private abstract class ResourceMixIn {} }
这种方式通过混入类(MixIn)为指定类单独设置反序列化规则,不影响其他类的默认行为。
额外注意事项
确保你使用的@JsonIgnoreProperties注解是com.fasterxml.jackson.annotation.JsonIgnoreProperties包下的,而非其他JSON库的同名注解(如旧版Jackson的org.codehaus.jackson包),否则注解不会生效。
内容的提问来源于stack exchange,提问作者Code Junkie

