gpt4 book ai didi

java - 如何正确使用Optional和 `@RequestBody`?

转载 作者:行者123 更新时间:2023-12-02 01:54:15 26 4
gpt4 key购买 nike

我使用 Spring Boot 2.0.8.RELEASE。

我有一个 @RestController 方法,如下所示:

    @PostMapping("/message")
public PushMessageResponse sendPush(@Validated @RequestBody PushMessageRequest pushMessageRequest) {
final List<String> sentMessage = pushService.sendMessage(pushMessageRequest);

return new PushMessageResponse(sentMessage);
}

我有一个 PushMessageRequest 类,如下所示:

@RequiredArgsConstructor
@Data
public class PushMessageRequest {

private final Optional<UUID> clientId;
private final Optional<String> token;
private final Optional<String> text;
private final Optional<PushOptions> pushOptions;
@NotBlank
private final String appName;

}

如果我向此方法发送一个请求,其主体不包含某些属性,我会发现这种属性(那些我没有在 JSON 请求中传递的属性)为 null.

我已经尝试添加这样的配置:

@Configuration
public class JacksonConfiguration {

@Bean
public Module jdk8Module() {
return new Jdk8Module();
}
}

我期望看到我的 DTO 的可选属性不是 null,但该属性的值为 Optional.empty()

最佳答案

为什么要在此处使用Optional。您可以简单地使用常规类,并使用 Optional.ofNullable() 在 Controller 类中创建 Optional 对象。

Optional API 主要用于返回可能为 null 的值的方法,而不是传输数据。例如,您可以将消息类编写为:

public class PushMessageRequest {
private UUID clientId;
...
}

在你的 Controller 类中,你可以调用:

@PostMapping("/message")
public PushMessageResponse sendPush(@Validated @RequestBody PushMessageRequest pushMessageRequest) {
Optional<UUID> uuidOptional = Optional.ofNullable(pushMessageRequest.getUUID());
...
}

有关为什么不应在序列化的类中使用 Optional 的更详细说明,请参阅:Why java.util.Optional is not Serializable, how to serialize the object with such fields 。尽管这特指标准 Java 序列化,但其推理也适用于 JSON 序列化。

关于java - 如何正确使用Optional和 `@RequestBody`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57408364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com