14
我對JSR-303的@Valid
註釋存在問題。該annotation工作正常,正常列表或及組合,但我試圖驗證的地圖,其中包含列表,即Howto驗證地圖集合
@Valid
HashMap<String, ArrayList<Object1>> map;
在這種情況下,Object1
類的實例並不驗證。有沒有一種方便的方式來遞歸執行此操作,而無需迭代每個對象並手動驗證它?
我對JSR-303的@Valid
註釋存在問題。該annotation工作正常,正常列表或及組合,但我試圖驗證的地圖,其中包含列表,即Howto驗證地圖集合
@Valid
HashMap<String, ArrayList<Object1>> map;
在這種情況下,Object1
類的實例並不驗證。有沒有一種方便的方式來遞歸執行此操作,而無需迭代每個對象並手動驗證它?
當地圖值本身列表時,規範沒有指定驗證行爲。
由迭代提供的每個對象進行驗證。對於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;
}
}
是的,我試圖寫一個自定義驗證器,但valiate實際的對象,我需要知道類型。設置> constraintViolations = validator.validate(car); –
liecno
您可以爲通用類型使用通配符。有關如何設置驗證程序的示例,請參閱我的答案的編輯。 – Perception