V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
passerbytiny
V2EX  ›  Java

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

  •  
  •   passerbytiny · 2019-03-12 15:09:43 +08:00 · 3859 次点击
    这是一个创建于 2086 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 试验了它,没有其它框架、工具,或人来提到它。

    21 条回复    2020-07-02 14:16:56 +08:00
    Belmode
        1
    Belmode  
       2019-03-12 15:14:03 +08:00 via Android
    基本不用 lombok,宁愿舍弃这种便利性。
    GM
        2
    GM  
       2019-03-12 15:30:10 +08:00
    说了半天,就是没说问题到底是什么?到底是哪里无解?什么地方冲突了?
    wfd0807
        3
    wfd0807  
       2019-03-12 15:41:46 +08:00
    基本不用 lombok +10086
    wanghaa
        4
    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
        5
    feiyuanqiu  
       2019-03-12 15:57:47 +08:00
    给每个字段加 @JsonProperty 注解吧
    foutin
        6
    foutin  
       2019-03-12 15:57:50 +08:00
    passerbytiny
        7
    passerbytiny  
    OP
       2019-03-12 16:07:36 +08:00
    @wanghaa #4 这种情况只能临时解决,java bean 这种必须有 Getter、Setter 的规范,已经越来越撑不住了
    @feiyuanqiu #5 这个不管用,它只能解决名称不同,不能解决没有 Getter、Setter
    @foutin #6 不是这个
    wc951
        8
    wc951  
       2019-03-12 16:10:38 +08:00 via Android
    这种实验性注解不敢瞎用
    micean
        9
    micean  
       2019-03-12 16:19:38 +08:00
    换 gson^_^
    gz911122
        11
    gz911122  
       2019-03-12 16:52:58 +08:00
    gson 应该是可以的
    feiyuanqiu
        12
    feiyuanqiu  
       2019-03-12 16:55:26 +08:00   ❤️ 1
    BBCCBB
        13
    BBCCBB  
       2019-03-12 16:55:36 +08:00
    @Accessors(fluent = true)
    那就不要用这个特性吧,jackson 需要使用字段的 get,set 方法来处理字段
    notreami
        14
    notreami  
       2019-03-12 17:01:53 +08:00
    不用 lombok,是什么鬼?难道还在 jdk1.5 ??
    samples
        15
    samples  
       2019-03-12 17:04:52 +08:00
    @feiyuanqiu 这个圣光主题......
    passerbytiny
        16
    passerbytiny  
    OP
       2019-03-12 17:58:18 +08:00
    @feiyuanqiu #12 多谢测试,看来 Jackson 在设置读取值的时候回做兼容性处理,只不过在决定有哪些字段的时候只认 Getter、Setter,或 Builder。
    liaojl
        17
    liaojl  
       2019-03-12 19:32:35 +08:00 via Android
    标题已经说了“不要涉及该不该用 Lombok ”,评论区里还一堆人说不要用 lombok🌚
    yujunhao8831
        18
    yujunhao8831  
       2019-03-12 19:58:01 +08:00
    @Getter
    @Setter
    @Accessors( chain = true )

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

    这样不就行了
    lidfather
        19
    lidfather  
       2019-03-12 21:15:34 +08:00 via Android
    确实没什么好用的,还得安装插件
    coang
        20
    coang  
       2019-03-13 10:54:03 +08:00
    @Accessors( chain = true ) 用 chain +1
    CamD
        21
    CamD  
       2020-07-02 14:16:56 +08:00
    idea 自动生成 setter,getter 不也就解决了,而且肯定兼容需要调用 setter,getter 的地方
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5422 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:20 · PVG 09:20 · LAX 17:20 · JFK 20:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.