【问题标题】:Missing Validation Error Message of Java ConstraintValidator on class level类级别的 Java ConstraintValidator 缺少验证错误消息
【发布时间】:2021-11-05 14:05:23
【问题描述】:

我有一个 java spring boot 项目,我想验证匹配的密码并在 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);
    }
}

调用了类级别的验证器,但响应负载中不包含错误消息。当我使用用于属性 (@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 的错误消息也包含在错误响应中?

【问题讨论】:

标签: java spring-boot validation


【解决方案1】:

我找到了解决方案。它缺少属性路径,因此被忽略。添加这个解决了这个问题:

constraintValidatorContext.buildConstraintViolationWithTemplate(constraintValidatorContext.getDefaultConstraintMessageTemplate())
    .addPropertyNode("passwordConfirmation").addConstraintViolation();

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2012-09-05
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多