Use custom setter in Lombok's builder
Per the documentation for @Builder
: Just define enough skeleton yourself. In particular, Lombok will generate a class UserBuilder
, fields mirroring the User
fields, and builder methods, and you can provide any or all of this yourself.
@Builder
public class User {
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;
}
}
}
I've accepted chrylis's answer but for completeness, here's are some ways to minimize customization and duplication.
Custom setter and builder with static helper
A static helper can be used to shares most of the set password functionality across the custom User.UserBuilder::password
method and the custom User::setPassword
method:
@Data
@Builder
public class User {
private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
private String password = null;
public void setPassword(String password) {
this.password = _encodePassword(password);
}
public static class UserBuilder {
public UserBuilder password(String password) {
this.password = _encodePassword(password)
return this;
}
}
private static String _encodePassword(String password) {
Assert.notNull(password);
return ENCODER.encode(password);
}
}
Custom setter and constructor
A custom constructor can use User::setPassword
which is invoked by the Lombok generated User.UserBuilder::build()
:
@Data
@Builder
public class User {
private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
private String password = null;
User(String password) {
setPassword(password);
}
public void setPassword(String password) {
Assert.notNull(password);
this.password = ENCODER.encode(password);
}
}
Custom setter and constructor with static helper
Or, a little more elegantly, with a custom constructor and a static helper method:
@Data
@Builder
public class User {
private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
private String password = null;
User(String password) {
_encodePassword(password, this);
}
public void setPassword(String password) {
_encodePassword(password, this);
}
private static _encodePassword(String password, User user) {
Assert.notNull(password);
user.password = ENCODER.encode(password);
}
}
You are using setPassword rather than the builder's set method.
Here is what worked for me:
import lombok.Builder;
import lombok.Data;
@Builder
@Data
public class User {
private String username;
private String password;
public static class UserBuilder {
private String password;
public UserBuilder password(String password ) {
this.password ="ENCRIYP " + password;
return this;
}
}
public static void main(String[] args) {
System.out.println(User.builder().username("This is my username").password("Password").build().toString());
}
}
The result was:
User(username=This is my username, password=ENCRIYP Password)