javalombok

Lombok @SuperBuilder doesn't accept parameters


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

Solution

  • 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.