Assuming two simple classes:
@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;
}
The compilation fails on the following error. Upon reading Lombok | @SuperBuilder I have no idea what I could miss.
C:\Dev\companyproject\src\main\java\com\companyproject\entity\Person.java:12 java: type com.companyproject.entity.Party.PartyBuilder does not take parameters
The issue here is the incorrect @Builder
annotation on the parent class. The documentation for @SuperBuilder
mentions:
Most importantly, it requires that all superclasses also have the
@SuperBuilder
annotation.
So the correct parent class would be:
@Data
@SuperBuilder // <- annotation replaced here
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {
protected Long id;
protected String status;
}
Addendum:
A key difference between both annotations is that @SuperBuilder
also creates a constructor of the class expecting a corresponding builder argument.
For Party
it would look like:
protected Party(PartyBuilder<?, ?> b) {
this.id = b.id;
this.status = b.status;
}
and for Person
:
protected Person(PersonBuilder<?, ?> b) {
super(b);
this.name = b.name;
this.sex = b.sex;
}
As you can see, the child class constructor wants to pass its own builder to the parent class constructor and this will only be possible if there is a matching constructor there, and @Builder
wouldn't generate it.
Also PersonBuilder<>
extends PartyBuilder<>
, that is why calling super
with the child type builder works fine here.