[英]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.