【问题标题】:How to properly use Lombok @Data with interfaces如何正确使用带有接口的 Lombok @Data
【发布时间】:2019-11-30 11:43:17
【问题描述】:

由于 Hibernate 不允许我使用未映射的联接表编写联接查询,因此我在我的 spring book 应用程序中使用了相当多的本机查询。我遇到了这个article,它帮助我将原生查询完美地投射到 DTO 中。如文章中所述,我正在使用带有 @Data (Lombok) 注释的 DTO 接口。当我通过“作为 Spring Boot 应用程序运行”在 Eclipse 中本地运行它时,它就像一个魅力。但是当我尝试mvn package 以部署 JAR 时,我遇到了编译错误,指出

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

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

编辑:它适用于 Java 8(在 eclipse 中使用)并在 Java 11(全局路径版本)中引发编译错误。

【问题讨论】:

  • 在使用 mvn 或 eclipse 运行时,我会尝试找出类路径或配置中的差异。
  • 你是如何在 pom 中配置 Lombok 的?
  • @D.Lawrence 我没有在我的 pom.xml 中为 Lombok 做任何额外的配置。刚刚添加了依赖
  • @ldz 感谢您的指点。看来我在Eclipse中使用JDK11内的Java SE 1.8,而默认路径直接使用JDK 11。
  • 你不能在接口上添加@Data,因为它们的属性是隐式的public static final。

标签: java spring eclipse maven lombok


【解决方案1】:

您发现了一个 lombok 的“错误”,因为 eclipse 变体也应该生成该错误,而不是什么都不做。因为..它什么也没做。

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

@Data:

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

我认为您有点困惑,或者至少,是,所以,让我们退后一步,谈谈您要解决的问题/您的想法如果您将@Data 放在接口上,就会发生这种情况。

注意:Java11 与 Java8 的区别只是一个红鲱鱼;这不是这里的问题。 NB2:免责声明 - 我是项目 lombok 的核心维护者。

【讨论】:

  • 值得一提的是,你可以正确编写接口,然后在实现类上使用@Data,效果很好。
  • 有什么方法可以通过lombok连接接口和实现,而不是在接口中手动编写setter和getter?
  • @IgnatGalkin 没有。
  • @rzwitserloot 谢谢你的回答。你不认为它是一个有用的功能吗?对于像我这样使用意向编码的人来说,这可能真的很有帮助。
  • @IgnatGalkin 否。属性容器的接口很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2016-08-10
  • 2018-08-01
  • 2014-06-26
  • 1970-01-01
  • 2016-08-30
  • 2011-09-04
相关资源
最近更新 更多