Kotlin Spring:无需自定义反序列化,将空字符串RequestBody映射为null
解决空字符串Payload无法反序列化为null的问题
你的问题核心是客户端发送的空字符串""属于无效JSON,Jackson默认不会将其解析为null,导致400错误。以下是几种无需自定义反序列化器的解决方法:
1. 全局配置Jackson接受空字符串为null对象
在Spring Boot中,通过配置开启Jackson的ACCEPT_EMPTY_STRING_AS_NULL_OBJECT特性,就能让空字符串自动转为null:
配置文件方式(application.yml)
spring: jackson: deserialization: accept-empty-string-as-null-object: true
代码配置方式(Kotlin)
@Configuration class JacksonConfig { @Bean fun objectMapper(): ObjectMapper { return ObjectMapper() .enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT) } }
这个配置全局生效,所有需要将空字符串转为null对象的场景都会适用,完全匹配你TestRequest? = null的参数定义。
2. 端点层面单独处理RequestBody
如果不想修改全局配置,可以在端点中先接收String类型的请求体,手动判断后再反序列化:
@PutMapping("/{testId}/revoke") fun revoke( @PathVariable testId: String, @Valid @RequestBody(required = false) requestBody: String?, ): TestRevokeResponse { val request = requestBody?.trim()?.takeIf { it.isNotEmpty() }?.let { ObjectMapper().readValue(it, TestRequest::class.java) } return testService.revoke(testId, request) }
这里先对字符串做trim处理,排除空白字符串的情况,非空时才反序列化为TestRequest,否则直接传null到service层。
3. 配合DTO的空值注解增强处理
给你的DTO类添加@JsonInclude注解,确保空值在序列化/反序列化时的处理更一致,结合上面的全局配置效果更好:
@JsonInclude(JsonInclude.Include.NON_EMPTY) data class TestRequest(@field:Future val expiresDatetime: Instant? )
内容的提问来源于stack exchange,提问作者Lofalan
相关产品推荐
相关产品推荐

