2016-07-05 77 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