构造函数 SomeClass() 已在 class SomeClass 中定义

constructor SomeClass() is already defined in class SomeClass

我刚刚将 Spring Boot 1.5.13 应用程序(使用 Lombok)升级到 Spring Boot 1.5.14,但它现在无法编译并出现以下类型的错误:

constructor SomeClass() is already defined in class SomeClass

对于我的每个 POJO,例如

@Data
@NoArgsConstructor
public class SomeClass {
    private String someProperty;
}

这是 Lombok 1.6.22 中的错误;将龙目岛升级到 1.18.0:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.0</version>
    <scope>provided</scope>
</dependency>

或者,作为变通方法,更改注释的顺序:

@NoArgsConstructor
@Data
public class SomeClass {
    private String someProperty;
}

详情:

此错误的根本原因是 Lombok 1.16.22 中的错误。 Spring Boot 1.5.13 使用没有此错误的 Lombok 1.16.20,但 Spring Boot 1.5.14 将 Lombok 依赖项更新为 1.16.22 -- 不幸的是,Lombok 项目不符合SEMVER 然后触发了这个错误。

即使在最新版本

上,我也遇到了这个问题
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.6</version>
    <scope>provided</scope>
</dependency>

将我的成员变量标记为 final 后一切正常。

@RequiredArgsConstructor 生成一个带有必需参数的构造函数,其中必需的参数是最终字段和用 @NonNull 注释的字段(稍后详细介绍)

我使用以下方法重现了同样的问题:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

而且,就我而言,这是 @NoArgsConstructor 注释和 @Data 之间的冲突。

后来的结果是:

@Data implies @NoArgsConstructor

所以,the advice 删除了 @NoArgsConstructor 注释,但留下 @Data 对我很有帮助。