Lombok @Builder.Default 强制默认可选值为 null

2 jackson lombok java-8 option-type

在我的代码中,我有一个如下所示的类

public enum Test {
    VALUE1,
    VALUE2
}

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class MyClass {
  @JsonProperty(name = "test")
  private Optional<Test> test = Optional.empty();

}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但会出现以下错误:

警告:@Builder 将完全忽略初始化表达式。

太好了,让我补充一下@Builder.Default...

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class MyClass {
  @Builder.Default
  @JsonProperty(name = "test", required = true)
  private Optional<Test> test = Optional.empty();  
}
Run Code Online (Sandbox Code Playgroud)

这修复了错误,但现在,test当该值不存在时,该值将被强制为 null,而不是Optional.empty。我想保留可选模式并让对象的用户决定他们想要如何处理可选,而不是 Lombok 或 Jackson。

有没有办法让这项工作保持默认值Optional.empty()?如果没有,有没有办法可以忽略这个警告,因为它无法修复?

编辑:

想象一下,我们将一个有效负载传递到某个空的端点(因为我们想测试对象中唯一值的可选)

POST /my/end/point

有效负载将是{}

然后我们使用 Jackson 取回对象

MyClass result = mapper.readValue(payload, MyClass.class);

当我们查看生成的对象时,我们会发现它MyClass.test与使用时的预期null不同。否则,我们会收到上面的警告,但默认值已正确指定为。Optional.empty()@Builder.DefaultOptional.empty()

naX*_*aXa 5

存在代码风格问题。让 Lombok 为可选字段生成 getter/setter/constructor/builder 会产生以下结果:

\n\n
public MyClass(Optional<Test> test) {\n    this.test = test;\n}\n\npublic Optional<Test> getTest() {\n    return test;\n}\n\npublic void setTest(Optional<Test> test) {\n    this.test = test;\n}\n\n// ... imagine Builder here ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

getter 还可以,但是构造函数、setter 和 Builder 使用起来非常不方便。您必须Test使用其中一种静态方法来包装Optional,如下所示:

\n\n
// If value is known\nmyClass.setTest(Optional.of(Test.VALUE1));\n\n// If initializing with a variable which maybe null\nmyClass.setTest(Optional.ofNullable(anotherTest));\n
Run Code Online (Sandbox Code Playgroud)\n\n

它很丑。有一个更好的办法。
\n我假设您只需要Optionalgetter 上的返回类型,因此请提供您自己的 getter 实现,强制 Lombok 不生成它自己的\xe2\x80\x99s。

\n\n
@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@Getter\npublic class MyClass {\n\n    @JsonProperty(name = "test", required = true)\n    private Test test;\n\n    public Optional<Test> getTest() {\n        return Optional.ofNullable(test);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

智慧之源:Options 和 Lombok @ Medium

\n