繁体   English   中英

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

[英]How can I use properly Optional with a `@RequestBody`?

我使用的是 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 的 Optional 属性不为空,但该属性的值为Optional.empty()

根据@cameron1024、@AmanGarg、@RavindraRanwala,我不应该使用 Optional 作为字段,因为它不是故意的。

我选择创建返回字段的Optional#ofNullable()的方法的解决方案。

为什么要在这里使用Optional 您可以简单地使用常规类,并使用Optional.ofNullable()在您的控制器类中创建Optional对象。

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

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

在您的控制器类中,您可以调用:

@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 序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM