Java 如何正确地将可选项与“@RequestBody”一起使用?

Java 如何正确地将可选项与“@RequestBody”一起使用?,java,spring-boot,spring-mvc,jackson,optional,Java,Spring Boot,Spring Mvc,Jackson,Optional,我使用Spring Boot 2.0.8.0版本 我有一个@RestController方法,如下所示: @PostMapping(“/message”) public PushMessageResponse sendPush(@Validated@RequestBody PushMessageRequest PushMessageRequest){ 最终列表sentMessage=pushService.sendMessage(pushMessageRequest); 返回新的PushMess

我使用Spring Boot 2.0.8.0版本

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

@PostMapping(“/message”)
public PushMessageResponse sendPush(@Validated@RequestBody PushMessageRequest PushMessageRequest){
最终列表sentMessage=pushService.sendMessage(pushMessageRequest);
返回新的PushMessageResponse(sentMessage);
}
我有一个
PushMessageRequest
类,看起来像这样:

@RequiredArgsConstructor
@资料

公共类PushMessageRequest{ 私人最终可选客户ID; 专用最终可选令牌; 非公开最终可选文本; 私人最终选择权; @不空白 私有最终字符串appName; }
如果我向这个方法发送一个不包含属性的请求,我会看到这种属性(我在JSON请求中没有传递的属性)是null

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

@配置
公共类JacksonConfiguration{
@豆子
公共模块jdk8Module(){
返回新的Jdk8Module();
}
}

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

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

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

public class PushMessageRequest {
    private UUID clientId;
    ...
}
在控制器类中,您可以调用:

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

有关在序列化的类中不应使用
可选
的更详细说明,请参阅:。尽管这特别指的是标准Java序列化,但推理也适用于JSON序列化。

根据@cameron1024、@AmanGarg、@RavindraRanwala,我不应该将可选字段用作字段,因为它不是有意的


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

不要对字段声明使用
Optional
。你所做的一开始就是错的。@Ravindrananwala为什么?这些字段可能是空的,我想强制开发人员检查这些字段的可空性。您可以使用普通字段并使getter return Optional您可以这样做:公共类PushMessageRequest{private final UUID clientId;公共可选getClientId(){Optional.ofNullable(clientId);}}@AmanGarg sure,我这样做是为了解决问题。但是我认为SpringMVC中存在反序列化问题,因为
@RequestParam
可以像预期的那样使用Optional。或者我没有正确配置Spring。我想在字段中使用Optional,因为我想隐式地强制开发人员检查该字段的可空性。这不会强制他们检查null。使用optionals的懒惰开发人员只需调用
optional.get()
。使用常规类的懒惰开发人员只需调用它而不检查null。这是对API的滥用,您应该将它们更改为常规fieldspublic类PushMessageRequest{private final UUID clientId;public Optional getClientId(){Optional.ofNullable(clientId);}}@cameron1024当然,懒惰的开发人员可以做到这一点,但这段代码没有通过审查。