如何通过接口正确使用 Lombok @Data

How to properly use Lombok @Data with interfaces

我在 spring 图书应用程序中使用了相当多的本机查询,因为 Hibernate 不允许我使用未映射的连接表编写连接查询。我遇到了这个 article,它帮助我将本机查询精美地投射到 DTO 中。如文章中所述,我正在使用带有 @Data (Lombok) 注释的 DTO 接口。当我通过 "Run as Spring Boot Application" 在 eclipse 中本地 运行 时,它就像一个魅力。但是,当我尝试 mvn package 它以部署 JAR 时,出现编译错误,说明

myDTO.java:[8,1] @Data is only supported on a class.

当我在 eclipse 中 运行 它时,我不明白它是如何工作的,而 maven 给我一个编译错误。

编辑:它在 Java 8(在 eclipse 中使用)中工作,在 Java 11(全局路径版本)中抛出编译错误。

您发现了一个 lombok 'bug',因为 eclipse 变体也应该产生了该错误,而不是什么都不做。因为..它什么都不做。

正确响应是错误的原因是因为接口上的 @Data 没有意义。 @Data 做了 4 件事。在我列举它们之前,为了清楚起见,接口 不能有(非静态)字段 。你可以写它,但是 java 会默默地将它们升级到 public static final.

@Data:

  • 构造函数。 (对接口进行操作是不合法的,因此,它不能那样做)。
  • 为每个非静态字段创建 getter 和 setter。 (在界面中不能有任何东西,所以这什么都不做)。
  • 它制作了一个 toString 来打印类型和每个非静态字段(可以有一个,即使使用 default 功能的 impl,但它所做的只是打印类型的名称;不是很有用 toString!)
  • 它使 equalshashCode 实现(它也可以存在于此,但它所做的只是 return hashcode 和 return equalscanEqual 的一团乱麻,这没有多大意义,因为重点是比较非静态字段,但没有任何字段)。 None 这是有道理的,因为任何实现此接口的 类 都被有效地强制覆盖这些方法,以便它们无论如何都能工作,此时将不会使用这些实现。

我觉得你有点困惑,或者至少,是,所以,让我们退后一步,谈谈你试图解决什么问题/如果将 @Data 放在界面上,您认为会发生什么。

注意:Java11 与 Java8 区别是转移注意力;那不是这里的问题。 NB2: 免责声明 - 我是 lombok 项目的核心维护者。