【问题标题】:How to override Lombok Setter methods如何覆盖 Lombok Setter 方法
【发布时间】:2018-07-17 19:00:24
【问题描述】:

我在我的项目中使用 lombok,并在 POJO 类之上使用 @Setters@Getters 注释生成 SettersGetters。我正在尝试覆盖属性的 setters 方法,但它不起作用

我想检查 JSON 属性是 Empty 还是 Null 我想在 Setter 方法中设置默认值

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ToString
public class DefaultModel {


private String name;
@Setter(AccessLevel.NONE)private String age;    

public void setAge(String age) {
     if(age==null||age.trim().isEmpty()||age.equals("null")) {
        this.age="10";
    }else {
        this.age=age;
    }
}

}

工作场景:

        {
"name":"some",
"age":null
     }

     {
"name":"some",
"age":"null"
     }

    {
"name":"some",
"age":"  "
     }

失败的场景:

    {
"name":"some"
    }

输出:

DefaultModel(name=some, age=null)

我也将此作为参考here,但到目前为止还没有运气

【问题讨论】:

  • 不相关:也许你检查 age 是 != null 之前你打电话给isEmpty()...
  • 也不相关:为什么你的age 属性是String
  • 不是那么不相关:age.equals(null) - 此测试将返回 false 或抛出 NullPointerException(这与 @GhostCat 的评论有关)。
  • @GhostCat Lombok 以未记录的编译器 API 调用的形式施展黑魔法。据我所知,他们在 AST 上工作,但我不知道他们是否会删除现有节点(例如现有的 setter)。
  • 无关:您应该使用@Data 而不是使用@Getter@Setter 进行注释。 @Data 是它们的快捷方式,包括 @ToString@EqualsAndHashCode

标签: java lombok


【解决方案1】:

要么你遇到了一个我从未见过的错误,要么你测试错了。

类似注释

@Setter(AccessLevel.NONE) private String age;

在字段级别确实阻止了 setter 的生成。但是鉴于您正在定义一个 setter,您甚至不需要它。显式的@Setter 也会停止生成。

我刚刚使用 Eclipse 4.7.3a 和 Lombok 1.18.0 尝试了您的示例,并且您的(错误的)setter 被调用。几年来我一直在使用 Lombok,从来没有遇到过这样的错误。

问题很可能是您的 JSON 反序列化器根本不使用 setter。 我猜,您正在测试类似的东西

DefaultModel defaultModel = deserialize("{\"name\":\"some\"}", DefaultModel.class);

而不是直接测试setter。这就是问题所在。

【讨论】:

  • @Deadpool 不知道邮递员是如何工作的,但我敢打赌它不使用二传手。 GSON 也不使用它们。
  • @maaartinus 同意你的观点,这就是为什么问@Deadpool (OP) 他/她是否曾在失败的场景中设置名称(调用设置器)......因为我也有 tested 它和它适用于null 是一个序列化/反序列化问题,与 loombok 完全无关。
  • 感谢您的澄清,我同意您的观点,这是 JSON 正文中缺失字段的反序列化问题
【解决方案2】:

JSON 反序列化器可能使用 Lombok 生成的构造函数(不是 setter)。

看看这里: Jackson deserialize default values missing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多