春季类水平验证和百里香叶



我正在学习Spring Framework和Thymeleaf。我已经知道如何通过使用类似${#fields.errors("xx")}的东西来显示字段错误。但是,我陷入了如何在百里香叶中显示对象错误消息的困扰。

这是我的用户窗体类:

@PasswordMatches
public class UserForm {
@NotNull
@NotEmpty
private String username;
@NotNull
@NotEmpty
private String password;
@NotNull
@NotEmpty
private String matchingPassword;
@NotNull
@NotEmpty
@ValidEmail
private String email;
/* setter and getter methods */

这是我的密码匹配注释:

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordMatchesValidator.class)
@Documented
public @interface PasswordMatches { 
String message() default "Passwords don't match";
Class<?>[] groups() default {}; 
Class<? extends Payload>[] payload() default {};
}
class PasswordMatchesValidator implements ConstraintValidator<PasswordMatches, Object> {  
@Override
public void initialize(PasswordMatches constraintAnnotation) {       
}
@Override
public boolean isValid(Object obj, ConstraintValidatorContext context){   
UserDto user = (UserDto) obj;
return user.getPassword().equals(user.getMatchingPassword());    
}     
}

这是我的控制器方法:

@RequestMapping(value="/registration", method=RequestMethod.POST)
public ModelAndView registerUserAccount(@ModelAttribute("user") @Valid UserForm userForm,
BindingResult result, WebRequest request, Errors errors) {
if (!result.hasErrors()) {
return new ModelAndView("registerSuccess");
}
else {
return new ModelAndView("registration", "user", userForm);
}
}

现在这是我的问题:如果密码字段和确认通行证字段不匹配,我如何获得 Thymeleaf 中的类级注释返回的默认错误消息?

我知道这是旧帖子,但我也遇到了这个问题,这是灵魂(也许它也会帮助其他人(: 将 PasswordMatchesValidator 修改为:

class PasswordMatchesValidator implements ConstraintValidator<PasswordMatches, Object> {  
@Override
public void initialize(PasswordMatches constraintAnnotation) {       
}
@Override
public boolean isValid(Object obj, ConstraintValidatorContext context){   
UserDto user = (UserDto) obj;
boolean isValid = user.getPassword().equals(user.getMatchingPassword());
if(!isValid){
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate())
.addPropertyNode( "matchingPassword" ).addConstraintViolation();
}
return isValid;

}

它会将验证结果绑定到您的"匹配密码"属性。所以在你的百里香叶模板中,我们像这样:

${#fields.errors("matchingPassword")}

form标记中添加以下内容:

<p data-th-each="err : ${#fields.allErrors()}" data-th-text="${err}" class="error">
Invalid input.
</p>
<p th:if="${#fields.hasErrors('${yourObject}')}" th:errors="${yourObject}"></p>

最新更新