我正在try 为某些类创建自定义验证器 我定义的约束如下(根据不同的样本,例如从here)

@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { MyClassValidator.class })
@Documented
public @interface MyClassValid {
    String message() default "The password2 does not comply with the rules";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

然后我创建了相应的验证器:

 public class MyClassValidator implements ConstraintValidator<MyClassValid, ChangePasswordBody> {
        @Override
        public boolean isValid(ChangePasswordBody value, ConstraintValidatorContext context) {
            
/*This check only for sample . Ot can be replaced by other logic*/
if (value.getNewPassword().length() > 2 ) {
                return true;
            }
            return false;
        }
    }

要验证的类:

@MyClassValid
public class ChangePasswordBody {
    private String oldPassword;
    private String newPassword;

    public String getOldPassword() {
        return oldPassword;
    }

    public void setOldPassword(String oldPassword) {
        this.oldPassword = oldPassword;
    }

    public String getNewPassword() {
        return newPassword;
    }
    
    public void setNewPassword(String newPassword) {
        this.newPassword = newPassword;
    }
}

这是使用ChangePasswordBody的代码

private static void testChangePwd(ApplicationContext applicationContext) {
    //...
    ChangePasswordBody pwdBody = new ChangePasswordBody();
    isValidPassword(pwdBody);
    //...
}
private static void isValidPassword(ChangePasswordBody pwdBody) {
    pwdBody.setNewPassword("l"); 
}

我看到在执行testChangePwd方法时-MyClassValidator.isValid没有被调用.代码中有什么遗漏/错误吗?提前谢谢你

推荐答案

验证不会自动发生,您必须使用Bean验证API(例如Validator)以某种方式调用它

假设Spring-Boot已经自动配置了Validator,在您的情况下,可以通过以下方式以编程方式触发验证:

private static void testChangePwd(ApplicationContext applicationContext) {
    
    ChangePasswordBody pwdBody = new ChangePasswordBody();
    pwdBody.setNewPassword("l");  

    Validator validator = applicationContext.getBean(Validator.class);
    Set<ConstraintViolation<ChangePasswordBody>> validationErrors =  validator.validate(pwdBody);

    //handle the validationErrors here...
}

但是,它需要从业务代码中的Spring上下文中获取一个Bean,这是一个非常糟糕的 idea ,因为它会将它耦合到Spring.更好的方法是将您想要验证的对象作为方法参数,并通过执行该方法来验证它.

类似的内容:

@Validated
public class PasswordService {

    public void changePassword(@Valid ChangePasswordBody request) {

    }
}

如果ChangePasswordBody没有通过验证,它将抛出ConstraintViolationException.

Java相关问答推荐

JPackage-results已安装-如何添加系统属性?

如何使用解析器组合子解析Java数组类型签名?

Java Stream,需要更新列表对象列表

如何在返回bigint []值的子查询中使用any?

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

Spring Boot@Cachebale批注未按预期工作

Java中实现的归并排序算法给出ArrayIndexOutOfBound异常

如何创建同一类的另一个对象,该对象位于变量中?

当涉及到泛型时,类型推理在Java中是如何工作的?

Mapstruct不能正确/完全映射属性

try 判断可选参数是否为空时出现空类型安全警告

try 将JSON字符串响应从API转换为映射字符串、对象>;时出错

Regex以查找不包含捕获组的行

无法使用Freemarker从XML中读取重复的标记值

如何在@CsvSource中传递空格作为值

如果List是一个抽象接口,那么Collectors.toList()如何处理流呢?

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?

由于可为null,无法在kotlin中实现java接口

设置背景时缺少Android编辑文本下划线

Spring Mapstruct如何获取Lazy初始化实体字段的信息?