2016-07-05 64 views
0

我有我需要在ConstraintValidation没有得到应用到列表

@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

你的约束将得到实际的名单没有通过它的内容。如果您正在使用Java 8和最新版本的Hibernate Validator,则可以使用type argument constraints。您只需确保在约束中也添加ElementType.TYPE_USE@Target。类型参数约束尚未成为Bean验证的官方部分,但将在其下一版本中(BV 2.0)。

您将有这样的事情:

protected List<@KeyValid KeyValue> keyValues;

或者,你能不能把@KeyValid约束作为类级别的约束上KeyValue

+0

不幸的是我现在被Java 7困住了,但是我没有读过关于参数声明中的注释。看起来不错。但是有什么办法可以用Java 7做些什么,而且我也不能直接将注释添加到类中,因为它是生成的源。 –

+1

您可以使用Hibernate Validator API进行编程约束声明,以将约束添加到“KeyValue”的类定义中。这样你就不需要触摸它的源代码,只需通过'@ Valid'验证列表即可。 – Gunnar