我有需要在
上运行一些验证的对象列表 @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'
答案 0 :(得分:0)
你的约束会传递实际的List而不是它的元素。如果您使用的是Java 8和最新版本的Hibernate Validator,则可以使用type argument constraints。您只需确保在约束中将ElementType.TYPE_USE
添加到@Target
。类型参数约束还不是Bean验证的正式部分,但将在下一版本中(BV 2.0)。
你会有这样的事情:
protected List<@KeyValid KeyValue> keyValues;
或者,您是否可以将@KeyValid约束作为类级别约束放在KeyValue
上?