20

I am trying to implement the builder pattern using Lombok's @Builder but it does not detect any of the record fields:

@Builder(builderMethodName = "internalBuilder")
public record ApiError(String title, Map<String, String> errors) {

    public static ApiErrorBuilder builder(String title) {
        return internalBuilder().title(title); // Cannot resolve method 'title' in 'ApiErrorBuilder'
    }
}

When I turn record to a class, everything works as expected:

@Builder(builderMethodName = "internalBuilder")
public class ApiError {

private final String title;
private final Map<String, String> errors;

    public ApiError(String title, Map<String, String> errors) {
        this.title = title;
        this.errors = errors;
    }

    public static ApiErrorBuilder builder(String title) {
        return internalBuilder().title(title);
    }

    // getters

}

Is this happening because Lombok currently does not work well with records yet?

I am using IntelliJ and Lombok 1.18.22

Ismayil Karimli
  • 385
  • 1
  • 4
  • 8
  • 2
    Please try if you can use maven/gradle to build. In my case `mvn clean compile` is working fine and IntelliJ is having compile issue. – samabcde Nov 03 '21 at 13:31
  • @samabcde yeah you were right. Tried with maven and build was successful. Seems like it's an IntelliJ issue. – Ismayil Karimli Nov 03 '21 at 17:44
  • What did you expect? They both generate code, and both are new(ish) features. One or the other has to generate its code first. Whichever one that is will not recognize the other... because the other will not yet exist at that point. The accepted answer makes a lot of sense. Most features would more or less implement themselves, and then there are wrinkles these. – Nate T Nov 05 '21 at 13:07

3 Answers3

32

It is a known Intellij bug. There is, however, a workaround:

This doesn't work:

@Builder
public record MyRecord(String myField) {}

This does:

public record MyRecord(String myField) {
    @Builder public MyRecord {}
} 

Important: Once you insert the @builder inside the record, you must remove the @builder above it

yoni
  • 1,164
  • 2
  • 13
  • 29
10

According to this records are supported from Lombok version v1.18.20

@Builder on records is supported since the last release v1.18.20. Which version are you using? Note that this may also be just an IDE issue. If you are using IntelliJ, it may not be supported, yet.

Probably an IntelliJ issue ... try writing the code without IntelliJ auto-complete, see if it compiles ... if it does ... its an IntelliJ issue ... if it does not, something is wrong with your code.

Arthur Klezovich
  • 2,595
  • 1
  • 13
  • 17
  • The code itself is fine as I when change the record to class everything works as expected (`@Builder` detects and generates methods for the fields) – Ismayil Karimli Nov 03 '21 at 13:32
  • 3
    Just raised a ticket [Unexpected compile error with @Builder on record](https://github.com/mplushnikov/lombok-intellij-plugin/issues/1075) – samabcde Nov 03 '21 at 14:09
5

It's an IntelliJ issue. Upgrading IntelliJ version fixed this problem.

Scratchy
  • 51
  • 1
  • 2