簡體   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