在具有超类的 Lombok 构建器中使用自定义 setter

Use custom setter in Lombok's builder with superclass

我想在 Lombok 的构建器中使用自定义 setter 并覆盖 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.

@Builder 相比,@SuperBuilder 生成两个构建器 class,一个 public 和一个 private。两者都大量加载了泛型以确保正确的类型推断。

如果您想向构建器添加或修改方法 class,您应该查看未自定义的 delomboked 代码并复制并粘贴 public abstract static class header 从那里。否则你可能会弄错泛型,导致你无法修复的编译器错误。另请查看生成方法的 return 类型和语句,以确保您正确定义了它们。

@SuperBuilder documentation也提到了这个:

Due to the heavy generics usage, we strongly advice to copy the builder class definition header from the uncustomized delomboked code.

对于您的情况,您必须按如下方式自定义构建器:

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();
    }
}