最近我对API做了更改,一开始应该是向后兼容的,但由于客户端我的端点开始响应400 Bad Request,我所做的是将可选的RequestBody添加到PUT端点,这应该不会造成任何问题,因为它是可选的,但客户端发送的空字符串值无法反序列化到对象中,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?

我已经try 编写我自己的反序列化程序,但创建反序列化程序似乎是一种开销.

推荐答案

有没有一种方法可以将空字符串默认为NULL而不写 自定义反序列化程序?

可以,您可以启用ACCEPT_EMPTY_STRING_AS_NULL_OBJECT反序列化功能,以允许将POJO和其他 struct 化值( map 、集合)的JSON空字符串值("")绑定为null:

val mapper = ObjectMapper()
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)
val testRequest = mapper1.readValue<TestRequest>(request)

如果像您所描述的那样,更改仅限于一个终结点,则可以在绑定控制器内创建一个新的ObjectMapper映射器,并启用该功能以避免应用程序的其他部分出现未知的副作用,并将RequestBody值转换为string值,然后将字符串值传递给本地映射器.

Java相关问答推荐

使用log 4j2格式的Hibernate 显示SQL日志(log)

Spring安全实现多个SQL表身份验证

基于仅存在于父级中的字段查询子文档?

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

JDK22执行repackage of goal org. springframework. boot:spring—boot—maven—plugin:3.2.3:repackage failed:unsupported class file major version 66—>

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

为什么在枚举中分支预测比函数调用快?

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

Java流传输一个列表并创建单个对象

用OSQL创建索引

使用多个RemoteDatabase对象的一个线程

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

如何只修改父类ChroniclerView位置0处的第一个嵌套ChroniclerView(child)元素?

Java创建带有扩展通配符的抽象处理器

FETCH类型设置为LAZY,但它仍会发送第二个请求

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

ReturnedRect在升级后反转

Eureka客户端无法使用用户/通行证注册到Eureka服务器

如何组合Mono和Flux