Kotlin Spring 可选的 RequestBody 映射空字符串为 null。

3
最近我对一个API进行了更改,起初应该是向后兼容的,但由于客户端的原因,我的端点开始响应“400 Bad Request”。我所做的是在PUT端点中添加可选的RequestBody,这不应该引起任何问题,因为它是可选的,但客户端发送了空字符串值,无法反序列化为对象,Jackson无法反序列化。
我的DTO对象:
data class TestRequest(@field:Future val expiresDatetime: Instant? )

端点定义:

@PutMapping("/{testId}/revoke")
fun revoke(
@PathVariable testId: String,
@Valid
@RequestBody(required = false)
request: TestRequest? = null,
): TestRevokeResponse =
testService.revoke(testId, request)

在调试发送到端点的内容时,我注意到这些标头: Content-Type: application/json content-type: application/json; charset=utf-8 content-length: 2 负载为:"" 有没有一种方法可以将空字符串默认为null而不编写自定义反序列化程序?
我尝试编写自己的反序列化程序,但对于这种情况创建反序列化程序似乎是一种开销。
1个回答

1
有没有一种方法能够在不编写自定义反序列化程序的情况下将空字符串默认为 null?
是的,您可以启用ACCEPT_EMPTY_STRING_AS_NULL_OBJECT反序列化功能,允许JSON空字符串值("")绑定为POJO和其他结构化值(Maps、Collections)的null
val mapper = ObjectMapper()
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)
val testRequest = mapper1.readValue<TestRequest>(request)

如果更改仅限于您所描述的一个端点,您可以在绑定控制器内创建一个启用了功能的新ObjectMapper映射器,以避免影响应用程序中的其他部分,并将RequestBody值转换为string值,然后将字符串值传递给本地映射器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接