Spring中Jackson缺失JSON数值反序列化为0.0,如何触发Bad Request?
解决Spring Kotlin数据类缺失字段未触发BAD REQUEST的问题
当前你的Kotlin数据类中,upper和lower都是非空的Double类型。Jackson默认会对缺失的数值类型字段填充默认值(比如0.0),而不是将其视为请求参数缺失,因此不会触发400 BAD REQUEST。要实现你期望的行为,可通过以下两种方案配置:
方案一:针对字段配置校验
将字段改为可空类型,并通过@JsonProperty(required = true)标记为必填。这样Jackson在反序列化时,若检测到字段缺失会直接抛出异常,Spring会自动转为400响应:
@JsonIgnoreProperties(ignoreUnknown = true) data class MandatoryLimits( @JsonProperty(required = true) val upper: Double?, @JsonProperty(required = true) val lower: Double? )
使用可空类型是为了避免Jackson自动填充默认值,同时required = true明确要求该字段必须存在于请求体中。
方案二:全局配置Jackson严格校验
在Spring Boot中,可以通过全局配置让Jackson对构造函数的必填参数缺失时抛出异常:
方式1:通过配置类实现
@Configuration class JacksonConfig { @Bean fun objectMapper(): ObjectMapper { return ObjectMapper() .registerModule(KotlinModule()) // 构造函数必填参数缺失时抛出异常 .configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true) // 可选:开启非空参数传入null时的校验 .configure(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES, true) } }
方式2:通过配置文件实现(application.properties)
# 开启构造函数必填参数缺失校验 spring.jackson.deserialization.fail-on-missing-creator-properties=true # 可选:开启非空参数传入null时的校验 spring.jackson.deserialization.fail-on-null-creator-properties=true
这种方式无需修改数据类,全局生效后,所有Kotlin数据类的必填构造参数缺失时都会触发400响应。
注意:@JsonIgnoreProperties(ignoreUnknown = true)仅用于忽略请求中未知的字段,不会影响必填字段的校验逻辑,可以保留。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

