Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lombok's @Builder not detecting fields of the Java Record

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

like image 835
Ismayil Karimli Avatar asked Nov 03 '21 12:11

Ismayil Karimli


People also ask

Why Lombok builder is not working?

Re-index your Maven project; make sure auto import is turned on. Check External Libraries in the left Project tab to make sure that Lombok appears. Close the project and re-open if there's any red in the Maven tab on the right.

How do you declare a record in Java?

To create a record, call its constructor and pass all the field information in it. We can then get the record information using JVM generated getter methods and call any of generated methods.

What is a Java record?

In Java, a record is a special type of class declaration aimed at reducing the boilerplate code.


Video Answer


2 Answers

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

like image 149
yoni Avatar answered Sep 24 '22 22:09

yoni


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.

like image 24
Arthur Klezovich Avatar answered Sep 23 '22 22:09

Arthur Klezovich