15

@ValidJSR-303の注釈に問題があります。注釈は通常のリストまたはセットに対しては正常に機能しますが、リストを含むマップを検証しようとしています。

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

この場合、Object1クラスのインスタンスは検証されません。すべてのオブジェクトを繰り返し処理して手動で検証することなく、これを再帰的に実行する便利な方法はありますか?

4

1 に答える 1

13

仕様では、マップ値自体がリストである場合の検証動作を指定していません。

JSR 303仕様から:

イテレータによって提供される各オブジェクトが検証されます。Map の場合、各 Map.Entry の値が検証されます (キーは検証されません)。

あなたのケースの値は @Valid アノテーションを持たないリストであるため、処理されません。これを回避するには、次のいずれかを実行できます。

含まれているリストを別の Bean でラップし、注釈処理をリストに強制します。

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

または、複雑なマップを処理するカスタム バリデータを作成することもできます。このようなもの:

@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;
   }
}
于 2012-05-23T15:22:38.350 に答える