【发布时间】:2018-03-29 23:50:22
【问题描述】:
在我的代码中,我有一个如下所示的类
public enum Test {
VALUE1,
VALUE2
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class MyClass {
@JsonProperty(name = "test")
private Optional<Test> test = Optional.empty();
}
这工作正常,但它给出了以下错误:
警告:@Builder 将完全忽略初始化表达式。
太好了,让我添加@Builder.Default...
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class MyClass {
@Builder.Default
@JsonProperty(name = "test", required = true)
private Optional<Test> test = Optional.empty();
}
这修复了错误,但现在test 值在它不存在时被强制为空,而不是Optional.empty。我想保留 Optional 模式,让对象的用户决定他们想要如何处理 Optional,而不是 Lombok 或 Jackson。
有没有办法让这个工作,所以默认保持Optional.empty()?如果没有,有没有办法可以忽略此警告,因为它无法修复?
编辑:
假设我们将有效负载传递给某个空的端点(因为我们想测试对象中 only 值的可选项)
POST /my/end/point
有效载荷为{}
然后我们使用 Jackson 来取回对象
MyClass result = mapper.readValue(payload, MyClass.class);
当我们查看生成的对象时,我们会发现MyClass.test 是null,而不是使用@Builder.Default 时预期的Optional.empty()。否则,我们会收到上面的警告,但默认值被正确指定为Optional.empty()。
【问题讨论】:
-
我想我是“那个人”,他宁愿编写样板代码也不愿使用需要和 IDE 插件的第三方工具(实际上随时可能失去支持)为我做事。你只是设法降低了我使用 Lombok 的欲望。
-
@JacobBlanton 感谢您的反馈,但是编写样板文件容易出错。在我作为开发人员的这些年里,我可以将许多非常愚蠢的错误归因于编写样板的复制/粘贴性质。也许你永远保持警惕,但我肯定不是。这些库受欢迎是有原因的,您可能想再给他们一次机会。
标签: java-8 jackson optional lombok