2016-01-28 28 views
1

我有我的bean中的字符串列表。這些字符串是電子郵件,我想驗證它們。電子郵件字符串集合的JPA驗證

@Email 
@ElementCollection(fetch = FetchType.LAZY) 
@OrderColumn 
private List<String> emails = new ArrayList<String>(); 

在執行時,我得到這個錯誤:

Caused by: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.util.List<java.lang.String>. 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.verifyResolveWasUnique(ConstraintValidatorManager.java:218) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.findMatchingValidatorClass(ConstraintValidatorManager.java:193) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.getInitializedValidator(ConstraintValidatorManager.java:97) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:125) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateComposingConstraints(ConstraintTree.java:233) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:102) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91) 
    at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:83) 
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:547) 
    ... 

什麼是這樣做的正確方法是什麼?或者還有其他方法可以做到這一點嗎?

回答

5

@Email僅適用於String沒有List,但你可以創建自己的驗證:

@Target({ ElementType.FIELD, ElementType.PARAMETER }) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = EmailCollectionValidator.class) 
@Documented 
public @interface EmailCollection { 
    String message() default "Invalid Email"; 

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

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

驗證:

​​

實現:

@EmailCollection 
@ElementCollection(fetch = FetchType.LAZY) 
@OrderColumn 
private List<String> emails = new ArrayList<String>(); 
+0

只有當集合中的第一個元素有效時,纔會返回「return validator.isValid(s,context)」行。我編輯了答案來解決這個問題,但它被拒絕了。 – rjdkolb

+1

@rjdkolb謝謝,我編輯了我的答案 – MangEngkus

5

實現一個附加的約束驗證爲@Email根據建議驗證集合here是一種實現方法。請注意,如果您違反約束條件,則可能在生成正確的屬性路徑時遇到問題。另請參閱HV-264

如果您使用的是Java 8,那麼您也可以使用最新的Hibernate Validator發行版(5.2.x),它支持Java 8類型級別註釋。你可以寫一些像List<@Email String>。但是,在這種情況下,您需要現在創建自己的@Email約束條件註釋,並確保@Target包含ElementType.TYPE_USE。另見Hibernate Validator docs

Bean Validation(2.0)的下一個版本將與Java 8保持一致。所有提供的約束將具有ElementType.TYPE_USE,並且可以直接使用。另見BVAL-202