@artemfisher

Как отобразить ошибки валидации Spring Framework (не Boot) в Thymeleaf?

Класс, объект которого будет проходить валидацию
public class UserRegForm {
	
	private int id;
	
	//register step 1
	
	@StringLength(min=3, groups= {RegisterStep1.class})
	private String login;
	
	@StringLength(min=5, groups= {RegisterStep1.class})
	private String password;
	
	@StringLength(min=5, groups= {RegisterStep1.class})
	private String name;
	
	@StringLength(min=5, groups= {RegisterStep1.class})
	private String surname;
	
	@BirthDate(groups = {RegisterStep1.class})
	private LocalDate birthDate;
	
	@TrueValidMarker(groups = {RegisterStep1.class})
	private FamilyStatus famStatus;
	
	//register step 2
	
	@StringLength(min=11, max=11, groups= {RegisterStep2.class})
	private String phone;
	
	@StringLength(min=3, groups= {RegisterStep2.class})
	private String country;
	
	@StringLength(min=3, groups= {RegisterStep2.class})
	private String city;
	
	@StringLength(min=30, groups= {RegisterStep2.class})
	private String about;
	
	@FileSize(min=100, groups = {RegisterStep2.class})
	private MultipartFile photo;		
	
// getters and setters не стал выклыдать сюда
}


Контролер:
@Controller
@RequestMapping("/")
public class RegisterController {
	
	@GetMapping("/register1")
	public String showRegiste1rPage(Model model)
	{	
		UserRegForm user = new UserRegForm();
		model.addAttribute("user", user);
		return "registerStep1";
	}
	
	@PostMapping("/register1")
	public String register1(@Validated(RegisterStep1.class) UserRegForm user, BindingResult result, 
			Model model, RedirectAttributes attr)
	{					
		if(result.hasErrors())
		{	
			model.addAttribute("user", user);
			return "registerStep1";
		}
		
		attr.addFlashAttribute("user", user);
		
		return "redirect:/web/register2";
	}
}


Форма:

<form method="post" th:action="@{'/'+${servletPath}+'/register1'}" th:object="${user}">                
<label th:text="#{register.login}"></label>
<input type="text" th:field="*{login}" required maxlength="20"/>
<p th:if="${#fields.hasErrors('login')}" th:errors="*{login}">Login error</p>
                    
<label th:text="#{register.password}"></label>
<input type="password" th:field="*{password}" required maxlength="20"/>
<p th:errors="*{password}"></p>

<label th:text="#{register.name}"></label>
<input type="text" th:field="*{name}" required maxlength="20"/>
<p th:errors="*{name}"></p>

<label th:text="#{register.surname}"></label>
<input type="text" th:field="*{surname}" required maxlength="20"/>
<p th:errors="*{surname}"></p>

<label th:text="#{register.birthdate}"></label>
<input type="date" th:field="*{birthDate}" required maxlength="20"/>
<p th:errors="*{birthDate}"></p>

<label th:text="#{register.fam_status}"></label>
<p th:errors="*{famStatus}"></p>
<label th:text="#{register.married}"></label><input type="radio" required value="0" th:field="*{famStatus}"/>
<label th:text="#{register.notmarried}"></label><input type="radio" required value="1" th:field="*{famStatus}"/>              
                    
<input type="submit" name="go" th:value="#{register.next}"/>
</form>


Проблема в том, что ошибки валидация отрабатывает, но на форме сообщение об ошибке не выводится.
Как я понял, проблема в том, что в коде
if(result.hasErrors())
{	
model.addAttribute("user", user);
return "registerStep1";
}


я добавляю user в качестве атрибута и тем самым обнуляю ошибки. Но если его не добавлять, тогда форма вообще не загрузится + мне нужно отобразить некорректно введенные данные. Как действовать в данной ситуации?
  • Вопрос задан
  • 50 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы