You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:42:45