Lombok @SuperBuilder 不带参数

Lombok @SuperBuilder doesn't take parameters

假设两个简单的类:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {

    protected Long id;
    protected String status;
}
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Person extends Party {

    private String name;
    private Long sex;
}

编译因以下错误而失败。阅读后 Lombok | @SuperBuilder 我不知道我会错过什么。

C:\Dev\companyproject\src\main\java\com\companyproject\entity\Person.java:12
java: type com.companyproject.entity.Party.PartyBuilder does not take parameters

这里的问题是父 class 上的 @Builder 注释不正确。 documentation for @SuperBuilder 提到:

Most importantly, it requires that all superclasses also have the @SuperBuilder annotation.

所以正确的父 class 应该是:

@Data
@SuperBuilder     // <- annotation replaced here
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {

    protected Long id;
    protected String status;
}

附录:

两个注释之间的一个主要区别是 @SuperBuilder 还创建了 class 的构造函数,期望有相应的构建器参数。

对于 Party 它看起来像:

protected Party(PartyBuilder<?, ?> b) {
    this.id = b.id;
    this.status = b.status;
}

Person:

protected Person(PersonBuilder<?, ?> b) {
    super(b);
    this.name = b.name;
    this.sex = b.sex;
}

如您所见,子 class 构造函数希望将其自己的构建器传递给父 class 构造函数,这只有在存在匹配的构造函数时才有可能,并且 @Builder 不会生成它。

另外 PersonBuilder<> 扩展了 PartyBuilder<>,这就是为什么调用 super 和子类型构建器在这里工作正常。