Используйте пользовательский сеттер в Lombok's builder с суперклассом - PullRequest
4 голосов
/ 10 марта 2020

Я хочу использовать пользовательский установщик в конструкторе Lombok и перезаписать 1 метод, например,

@SuperBuilder
public class User implements Employee {
    private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();

    private String username;

    private String password;

    public static class UserBuilder {
        public UserBuilder password(String password) {
            this.password = ENCODER.encode(password);
            return this;
        }
    }
}

, но у меня есть эта ошибка компиляции

Existing Builder must be an abstract static inner class.

1 Ответ

0 голосов
/ 10 марта 2020

В отличие от @Builder, @SuperBuilder генерирует два класса строителей: public и private один. Оба сильно загружены обобщениями для обеспечения правильного вывода типа.

Если вы хотите добавить или изменить метод в классе построителя, вы должны взглянуть на ненастроенный код delombok ed и скопировать и вставить public abstract static class заголовок оттуда. В противном случае вы, скорее всего, ошибетесь в обобщениях, что приведет к ошибкам компилятора, которые вы не сможете исправить. Также посмотрите на return типы и операторы сгенерированных методов, чтобы убедиться, что вы правильно их определили.

@SuperBuilder документация также упоминает это:

В связи с интенсивным использованием универсальных шаблонов настоятельно рекомендуем скопировать заголовок определения класса компоновщика из ненастроенного кода с разделителями.

В вашем случае вы должны настроить компоновщик следующим образом:

public static abstract class UserBuilder<C extends User, B extends User.UserBuilder<C, B>> {
    public B password(final int password) {
        this.password = ENCODER.encode(password);
        return self();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...