当前位置: 首页 > 知识库问答 >
问题:

类级别上缺少Java ConstraintValidator的验证错误消息

赵河
2023-03-14

我有一个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)时,错误消息如下所示。但是缺少密码确认消息。

{
  "timestamp": "2021-11-05T14:57:56.2488041",
  "errors": [
    {
      "code": 775,
      "field": "email",
      "message": "An account with the specified email already exists."
    }
  ]
}

实体通过控制器功能中的有效注释进行验证。

@PostMapping(path = PATH)
public ResponseEntity<UserAccountDataResponse> doUserSignUp(@RequestBody @Valid UserSignUpRequest userSignUpRequest) {
    //...
}

如何确保自定义ConstraintValidator的错误消息也包含在错误响应中?

共有1个答案

景阳曜
2023-03-14

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

constraintValidatorContext.buildConstraintViolationWithTemplate(constraintValidatorContext.getDefaultConstraintMessageTemplate())
    .addPropertyNode("passwordConfirmation").addConstraintViolation();
 类似资料:
  • 我有一个工作表单,它有一个必填字段,不能为空: 如果我在请求中指定此字段,但将该字段保留为空,则会得到以下响应: 如果我在请求中省略此字段,我将得到以下响应: 有没有一些内置的Symfony逻辑,我可以用它来使第二个例子与第一个例子相匹配? [编辑]使用的是Symfony 2.5-现在更新为Symfony 2.8。同样的问题。

  • 我得到了以下错误无法构建Hibernate SessionFactory;嵌套异常是org.hibernate.tool.schema.spi.模式管理异常:模式验证:缺少表[my.table] 这有版本问题吗?大多数示例都不使用模式,即使是官方的?https://github.com/spring-projects/spring-boot/tree/main/spring-boot-tests/

  • 问题内容: 我有下一个代码,随便抛出: 反应/道具类型onClickOut; 道具验证中缺少 反应/道具型儿童;道具验证中缺少 已定义,但eslint无法识别。 package.json .babelrc .eslintrc 问题答案: 问题出在handleClick中的流注释中,我删除了它,并且工作正常,谢谢@alik

  • 下面是XSD。 下面是xml文件。 当尝试使用http://www.utilities-online.info/xsdvalidation验证它时,我得到以下错误 第2行62:org.xml.sax.SAXParseException;行号:2;列号:62;CVC-ELT.1:找不到元素“Message”的声明。

  • 问题内容: 我要求在通用api模块(多模块项目)中,我不能使用任何形式的hibernate的验证注释,因此我确实使用了javax.validation中的一个可接受的注释。 当我要验证包含NotBlank批注的域对象(我使用vaadin)时,问题就开始了。我得到以下异常 验证通过调用进行 相同的代码与hibernate的NotBlank完美配合 javax的@Size @NotNull也可以正常工

  • 所以我刚刚在一个小项目中升级了SpringBoot版本,现在身份验证搞砸了。当我尝试获取身份验证令牌时,我得到一个错误: 我和邮递员玩得很开心。如果我将grant_type/pw/username从正文移到QueryParams,它就可以正常工作了。但我们不能改变这一点。那么,有没有办法找出是哪个依赖项更改导致了这种情况?我查看了升级文档(2.1-