2012-05-23 93 views
14

我對JSR-303的@Valid註釋存在問題。該annotation工作正常,正常列表或及組合,但我試圖驗證的地圖,其中包含列表,即Howto驗證地圖集合

@Valid 
HashMap<String, ArrayList<Object1>> map; 

在這種情況下,Object1類的實例並不驗證。有沒有一種方便的方式來遞歸執行此操作,而無需迭代每個對象並手動驗證它?

回答

13

當地圖值本身列表時,規範沒有指定驗證行爲。

JSR 303 specification

由迭代提供的每個對象進行驗證。對於Map,驗證每個Map.Entry的值 (密鑰未驗證)。

由於您的案例中的值是一個沒有@Valid批註的列表,因此它不會被處理。要解決此問題,您可以:

將包含的列表包裝到另一個bean中,強制註釋處理到列表中。

public class ListHolder<T extends Iterable> { 
    @Valid 
    public T wrappedList; 
} 

或者,您也可以編寫一個custom validator來處理複雜的地圖。這樣的事情:

@Target({ METHOD, FIELD, ANNOTATION_TYPE }) 
@Retention(RUNTIME) 
@Documented 
@Constraint(validatedBy = ValidMapValidator.class) 
public @interface ValidMap { 
    String message() default "valid.map"; 

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

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

public class ValidMapValidator implements 
     ConstraintValidator<ValidMap, Map<?, ?>> { 

    @Override 
    public void initialize(final ValidMap annotation) { 
     return; 
    } 

    @Override 
    public boolean isValid(final Map<?, ?> map, 
     final ConstraintValidatorContext context) { 
     if (map == null || map.size() == 0) 
     return true; 

     // Iterate each map entry and validate 
     return true; 
    } 
} 
+0

是的,我試圖寫一個自定義驗證器,但valiate實際的對象,我需要知道類型。設置> constraintViolations = validator.validate(car); – liecno

+0

您可以爲通用類型使用通配符。有關如何設置驗證程序的示例,請參閱我的答案的編輯。 – Perception