class 级别的 Java ConstraintValidator 缺少验证错误消息
Missing Validation Error Message of Java ConstraintValidator on class level
我有一个 java spring 引导项目,我想在其中验证匹配的密码并在 json 响应中显示错误。
public interface SecurityCredentialsRequest {
String getPassword();
String getPasswordConfirmation();
}
@Getter
@Setter
@PasswordConfirmation
public class UserSignUpRequest implements SecurityCredentialsRequest {
//...
@UniqueEmailUserSignup
private String email;
private String password;
private String passwordConfirmation;
}
验证者:
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordConfirmationValidator.class)
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Documented
public @interface PasswordConfirmation {
String message() default "The password and its confirmation do not match.";
Class[] groups() default {};
Class[] payload() default {};
}
@Component
public class PasswordConfirmationValidator implements ConstraintValidator<PasswordConfirmation, SecurityCredentialsRequest> {
@Override
public void initialize (final PasswordConfirmation constraintAnnotation) {
}
@Override
public boolean isValid(SecurityCredentialsRequest securityCredentialsRequest, ConstraintValidatorContext constraintValidatorContext) {
String password = securityCredentialsRequest.getPassword();
String passwordConfirmation = securityCredentialsRequest.getPasswordConfirmation();
return password != null && password.equals(passwordConfirmation);
}
}
调用了class级别的验证器,但响应负载中没有错误消息。当我使用另一个用于属性 (@UniqueEmailUserSignup
) 的自定义验证器时,错误消息如下所示。 passwordConfirmation
的消息丢失了。
{
"timestamp": "2021-11-05T14:57:56.2488041",
"errors": [
{
"code": 775,
"field": "email",
"message": "An account with the specified email already exists."
}
]
}
实体通过控制器函数中的 @Valid
注释进行验证。
@PostMapping(path = PATH)
public ResponseEntity<UserAccountDataResponse> doUserSignUp(@RequestBody @Valid UserSignUpRequest userSignUpRequest) {
//...
}
我如何确保自定义 ConstraintValidator 的错误消息也包含在错误响应中?
我找到了解决方案。它缺少 属性 路径,因此被忽略了。添加这个解决了问题:
constraintValidatorContext.buildConstraintViolationWithTemplate(constraintValidatorContext.getDefaultConstraintMessageTemplate())
.addPropertyNode("passwordConfirmation").addConstraintViolation();
我有一个 java spring 引导项目,我想在其中验证匹配的密码并在 json 响应中显示错误。
public interface SecurityCredentialsRequest {
String getPassword();
String getPasswordConfirmation();
}
@Getter
@Setter
@PasswordConfirmation
public class UserSignUpRequest implements SecurityCredentialsRequest {
//...
@UniqueEmailUserSignup
private String email;
private String password;
private String passwordConfirmation;
}
验证者:
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordConfirmationValidator.class)
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Documented
public @interface PasswordConfirmation {
String message() default "The password and its confirmation do not match.";
Class[] groups() default {};
Class[] payload() default {};
}
@Component
public class PasswordConfirmationValidator implements ConstraintValidator<PasswordConfirmation, SecurityCredentialsRequest> {
@Override
public void initialize (final PasswordConfirmation constraintAnnotation) {
}
@Override
public boolean isValid(SecurityCredentialsRequest securityCredentialsRequest, ConstraintValidatorContext constraintValidatorContext) {
String password = securityCredentialsRequest.getPassword();
String passwordConfirmation = securityCredentialsRequest.getPasswordConfirmation();
return password != null && password.equals(passwordConfirmation);
}
}
调用了class级别的验证器,但响应负载中没有错误消息。当我使用另一个用于属性 (@UniqueEmailUserSignup
) 的自定义验证器时,错误消息如下所示。 passwordConfirmation
的消息丢失了。
{
"timestamp": "2021-11-05T14:57:56.2488041",
"errors": [
{
"code": 775,
"field": "email",
"message": "An account with the specified email already exists."
}
]
}
实体通过控制器函数中的 @Valid
注释进行验证。
@PostMapping(path = PATH)
public ResponseEntity<UserAccountDataResponse> doUserSignUp(@RequestBody @Valid UserSignUpRequest userSignUpRequest) {
//...
}
我如何确保自定义 ConstraintValidator 的错误消息也包含在错误响应中?
我找到了解决方案。它缺少 属性 路径,因此被忽略了。添加这个解决了问题:
constraintValidatorContext.buildConstraintViolationWithTemplate(constraintValidatorContext.getDefaultConstraintMessageTemplate())
.addPropertyNode("passwordConfirmation").addConstraintViolation();