Lombok fluent=true 碰上 Jackson,目前无解,讨论一下?(更新,请不要涉及该不该用 Lombok ,不是重点)

2019-03-12 15:09:43 +08:00
 passerbytiny

Lombok fluent 如下,若

@Setter
@Getter
@Accessors(fluent = true)
String str;

public String str(){
    return this.str;
}
public SomeClass str(String str){
    this.str = str;
}

用起来很方便,但之前因为 Jackson 不支持的原因,只是小范围内部类中使用,然而今天一个内部类也需要 JSON 序列化,还是碰到一起了。

搜了一个小时,无解。 @Builder 只能解决 setter 方向,而且二者并不相容。见下面

// @Builder 的用法
SomeClass.builer().str("xxx").a("xxx").b("xxx").build();
// fluent 的用法
new SomeClass().str("xxx").a("xxx").b("xxx");

// 另外,Builder 是专门用于不可变类的,fluent 不要求不可变

我现在对 Lombok fluent=true 的用法产生怀疑了,貌似除了 Lombok 试验了它,没有其它框架、工具,或人来提到它。

3890 次点击
所在节点    Java
21 条回复
Belmode
2019-03-12 15:14:03 +08:00
基本不用 lombok,宁愿舍弃这种便利性。
GM
2019-03-12 15:30:10 +08:00
说了半天,就是没说问题到底是什么?到底是哪里无解?什么地方冲突了?
wfd0807
2019-03-12 15:41:46 +08:00
基本不用 lombok +10086
wanghaa
2019-03-12 15:46:42 +08:00
这种生成的不是标准的 java bean 结构,一般都是不推荐用,这个是省略掉 get set 前缀,如果想链式访问构造对象推荐用这个注解的另一个属性 chain=true
// chain 的用法
new SomeClass().setStr("xxx").setA("xxx").setB("xxx");
feiyuanqiu
2019-03-12 15:57:47 +08:00
给每个字段加 @JsonProperty 注解吧
foutin
2019-03-12 15:57:50 +08:00
passerbytiny
2019-03-12 16:07:36 +08:00
@wanghaa #4 这种情况只能临时解决,java bean 这种必须有 Getter、Setter 的规范,已经越来越撑不住了
@feiyuanqiu #5 这个不管用,它只能解决名称不同,不能解决没有 Getter、Setter
@foutin #6 不是这个
wc951
2019-03-12 16:10:38 +08:00
这种实验性注解不敢瞎用
micean
2019-03-12 16:19:38 +08:00
换 gson^_^
micean
2019-03-12 16:20:29 +08:00
gz911122
2019-03-12 16:52:58 +08:00
gson 应该是可以的
feiyuanqiu
2019-03-12 16:55:26 +08:00
BBCCBB
2019-03-12 16:55:36 +08:00
@Accessors(fluent = true)
那就不要用这个特性吧,jackson 需要使用字段的 get,set 方法来处理字段
notreami
2019-03-12 17:01:53 +08:00
不用 lombok,是什么鬼?难道还在 jdk1.5 ??
samples
2019-03-12 17:04:52 +08:00
@feiyuanqiu 这个圣光主题......
passerbytiny
2019-03-12 17:58:18 +08:00
@feiyuanqiu #12 多谢测试,看来 Jackson 在设置读取值的时候回做兼容性处理,只不过在决定有哪些字段的时候只认 Getter、Setter,或 Builder。
liaojl
2019-03-12 19:32:35 +08:00
标题已经说了“不要涉及该不该用 Lombok ”,评论区里还一堆人说不要用 lombok🌚
yujunhao8831
2019-03-12 19:58:01 +08:00
@Getter
@Setter
@Accessors( chain = true )

new User().setId(1L)
.setUsername("admin")
.setPassword("admin");

这样不就行了
lidfather
2019-03-12 21:15:34 +08:00
确实没什么好用的,还得安装插件
coang
2019-03-13 10:54:03 +08:00
@Accessors( chain = true ) 用 chain +1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/543748

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX