0

我有需要对其进行验证的对象列表

    @KeyValid
    @Valid
    protected List<KeyValue> keyValues;

我为它创建了以下注释:

@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = KeyValidator.class)
public @interface KeyValid{

    String message() default "invalid_parameter_default_message";

    String[] checks() default {};

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

这是我的验证器:

public class KeyValidator implements ConstraintValidator<KeyValid, KeyValue> {

    @Override
    public void initialize(KeyValid keyValid) {

    }

    @Override
    public boolean isValid(KeyValue keyValue, ConstraintValidatorContext constraintValidatorContext) {    

        return true;
    }
}

我在某处读过,如果列表或映射或集合由自定义约束注释,则可以批量验证集合,然后集合的所有元素都调用验证器,但上面的代码会引发以下错误

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'com.util.Validators.KeyValid' validating type 'java.util.List<com.model.KeyValue>'. Check configuration for 'keyValue'
4

1 回答 1

0

您的约束将使实际 List 传递而不是其元素。如果您使用的是 Java 8 和最新版本的 Hibernate Validator,则可以使用类型参数约束。您只需要确保也添加ElementType.TYPE_USE@Target您的约束中。类型参数约束还不是 Bean Validation 的正式部分,但将在它的下一个版本(BV 2.0)中。

你会有这样的事情:

protected List<@KeyValid KeyValue> keyValues;

或者,您不能将 @KeyValid 约束作为类级别约束KeyValue吗?

于 2016-07-06T07:56:42.030 回答