Search code examples
javaguicelombok

Lombok - retain field's annotation in constructor input params


Lombok misses field's annotation while auto generating constructor. Is there a way to retain field's annotation in constructor input params?

Class to generate constructor,

@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class Test {

    @Named("MyField")
    private final String field;
    @Named("MyHandler")
    private final SomeHandler handler;
}

Generated class :

public class Test {

    @Named("MyField")
    private final String field;
    @Named("MyField")
    private final SomeHandler handler;

    @Inject
    public Test(final String field, final SomeHandler handler) {
        this.field = field;
        this.handler = handler;
    }
}

Desired class :

public class Test {

    @Named("MyField")
    private final String field;
    @Named("MyHandler")
    private final SomeHandler handler;

    @Inject
    public Test(@Named("MyField")final String field, 
                @Named("MyHandler")final SomeHandler handler) {
        this.field = field;
        this.handler = handler;
    }

}

Solution

  • In version v1.18.4 Lombok added support for copying specific annotations. Meaning, that if you put following setting to lombok.config:

    lombok.copyableAnnotations += com.google.inject.name.Named
    

    and apply following Lombok annotations to your class:

    @RequiredArgsConstructor(onConstructor = @__(@Inject))
    public class Hello {
        @NonNull @Named("my-name") String name;
    }
    

    the @Named annotation should be copied to your generated constructor argument.

    Limitations: this does not work when annotation can't be put on a field or annotation on a field overrides constructor initialization