Search⌘ K
AI Features

Refactor the Edit User Implementation

Explore how to improve the user edit functionality by refactoring form data classes and validation in a Spring Security and Thymeleaf context. Understand how to separate password handling, update validation rules, and adjust the UI to enhance user management without requiring password entry during editing.

Extracting fields

To avoid having to enter the user’s password when editing user details, we’ll do a small refactor. We’ll start by creating an abstract super class with CreateUserFormData extracting most fields except for password and passwordRepeated:

Java
package com.tamingthymeleaf.application.user.web;
import com.tamingthymeleaf.application.infrastructure.validation.ValidationGroupOne;
import com.tamingthymeleaf.application.infrastructure.validation.ValidationGroupTwo;
import com.tamingthymeleaf.application.user.Gender;
import com.tamingthymeleaf.application.user.UserRole;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.*;
import java.time.LocalDate;
@NotExistingUser(groups = ValidationGroupTwo.class)
public class AbstractUserFormData {
@NotNull
private UserRole userRole; //<.>
@NotBlank
@Size(min = 1, max = 200, groups = ValidationGroupOne.class)
private String firstName;
@NotBlank
@Size(min = 1, max = 200, groups = ValidationGroupOne.class)
private String lastName;
@NotNull
private Gender gender;
@NotBlank
@Email(groups = ValidationGroupOne.class)
private String email;
@NotNull
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate birthday;
@NotBlank
@Pattern(regexp = "[0-9.\\-() x/+]+", groups = ValidationGroupOne.class)
private String phoneNumber;
public UserRole getUserRole() {
return userRole;
}
public void setUserRole(UserRole userRole) {
this.userRole = userRole;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public LocalDate getBirthday() {
return birthday;
}
public void setBirthday(LocalDate birthday) {
this.birthday = birthday;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}

We’ll keep password and passwordRepeated fields on ...