Kotlin SpringBoot下Jackson实现boolean字段isAgent的严格必填校验
解决方案
1. 调整请求体模型的字段定义
把isAgent字段设为Kotlin默认的非空Boolean类型,并加上两个关键注解:
@JsonProperty(required = true):强制要求请求必须携带这个字段,没传直接校验失败@field:NotNull:配合后续配置,确保字段值不能是Null
示例代码:
data class RequestModel( @JsonProperty(required = true) @field:NotNull val isAgent: Boolean )
2. 配置Jackson做严格的Boolean解析
通过Spring配置,让Jackson别自作主张把空串、空格转成false,遇到这些非法输入直接报错。
用配置文件(application.yml)搞定
spring: jackson: deserialization: # 禁止把Null赋值给非空的Boolean类型 allow-null-for-primitives: false # 只认JSON原生的true/false,拒绝字符串转布尔值 accept-string-as-boolean: false
用代码配置类搞定(如果需要更灵活的配置)
@Configuration class JacksonConfig { @Bean fun objectMapper(): ObjectMapper { return ObjectMapper() .registerModule(KotlinModule()) .configure(DeserializationFeature.ALLOW_NULL_FOR_PRIMITIVES, false) .configure(MapperFeature.ACCEPT_STRING_AS_BOOLEAN, false) } }
3. 开启控制器的校验功能
在你的REST控制器方法上加上@Valid注解,触发Spring的校验逻辑:
@RestController @RequestMapping("/api") class DemoController { @PostMapping("/test") fun handleRequest(@RequestBody @Valid request: RequestModel): ResponseEntity<String> { return ResponseEntity.ok("请求处理成功") } }
为啥这套配置能满足需求?
- 没传
isAgent字段:@JsonProperty(required = true)会让Jackson直接抛出缺失必填字段的异常 - 传了
null:因为关了ALLOW_NULL_FOR_PRIMITIVES,Kotlin的非空Boolean接不住Null,Jackson直接报错 - 传了空串/空格:关了
ACCEPT_STRING_AS_BOOLEAN后,Jackson不认这种字符串转布尔的操作,直接解析失败 @NotNull相当于双重保险,确保经过Jackson解析后的字段值肯定合法
这样所有你提到的非法场景都会触发校验失败,完全不用写自定义反序列化器。
内容的提问来源于stack exchange,提问作者Kartik Kodag
相关产品推荐
相关产品推荐

