【问题标题】:Lombok excluding field with @ToString.Exclude is not working带有@ToString.Exclude 的Lombok 排除字段不起作用
【发布时间】:2019-05-22 19:01:57
【问题描述】:

我正在使用 Lombok 删除样板代码。我正在尝试将实体打印到控制台,但出现 StackOverflowError。该实体与另一个实体有双向关系,所以我想从 toString 方法中排除这个实体。

我的实体如下所示:

@Entity
@Data
public class Foo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long fooId;

    private String name;

    @ManyToOne
    @JoinColumn(name = "barId")
    @EqualsAndHashCode.Exclude
    @ToString.Exclude
    private Bar bar; 
}

这是我第一次尝试使用@ToString.Exclude,但它似乎并没有表现出来。我使用不正确吗?当我在 Foo 对象上调用 toString 时,我只想打印出 fooIdname

编辑

我熟悉从顶级 @ToString 注释中排除或包含字段的替代方法。我试图避免这种情况。我只想在类级别使用@Data,并注释应该排除的字段。

编辑 2

仍在简化类上进行复制。龙目岛版本 1.18.8。

【问题讨论】:

  • 我不认为@ToString.Exclude 独立于@ToString 工作。通过文档进行检查。 projectlombok.org/api/lombok/ToString.html
  • @SubirKumarSao 感谢您的回复。将 @Data 替换为 @ToString 并不能解决问题。
  • 我们使用的版本 (1.16) 与 @ToString(exclude="bar") 配合使用
  • @TheGilbertArenasDagger @Data 包括 @ToString 所以你很擅长那个部分。

标签: java lombok


【解决方案1】:

为我工作。 lombok:1.18.8

import lombok.Data;
import lombok.ToString;

@Data
public class MyClass {
    public static void main(String args[]) {
        MyClass myClass = new MyClass();
        System.out.println("ToString::" + myClass);
    }

    private String a = "ABC";

    @ToString.Exclude
    private String b = "DEF";

}

输出:ToString::MyClass(a=ABC)

【讨论】:

  • 感谢您的发帖和 +1。我在 1.18.6 但升级时问题仍然存在。我删除了所有 JPA 注释,问题仍然存在。嗯....
  • 您是否更新了 eclipse Lombok 插件和项目依赖项,并清理/重建了项目?
【解决方案2】:

@ToString 接受参数exclude,可用于从字符串中排除字段。

@ToString(exclude = {"bar"})

@Entity
@ToString(exclude = {"bar"})
public class Foo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long fooId;

    private String name;

    @ManyToOne
    @JoinColumn(name = "barId")
    @EqualsAndHashCode.Exclude
    private Bar bar; 
}

【讨论】:

    【解决方案3】:

    您必须更新安装在 Eclipse 中的 lombok(下载新的 lombok.jar,运行 java -jar lombok.jar 并重新启动 Eclipse)。至少这对我来说解决了。

    【讨论】:

      【解决方案4】:
      lombok : 1.18.12
      

      @Exclude 对我有用。 @Exclude 只不过是 @ToString.Exclude 而已。 @Exclude 注解在@ToString 注解中定义。

      @Entity
      @Data
      public class Foo {
      
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private long fooId;
      
          private String name;
      
          @ManyToOne
          @JoinColumn(name = "barId")
          @EqualsAndHashCode.Exclude
          @Exclude
          private Bar bar; 
      }
      

      【讨论】:

        【解决方案5】:

        在 Kotlin 中

        您可以避免使用 Lombok 库并定义自定义注释 @ExcludeToString 以排除冗余参数或您需要的参数。

        GL

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-20
          • 2013-06-03
          • 2011-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多