私は以下のように私の春のコントローラへの第三者からのブラウザリダイレクトバックから受け取ることが地図を持っています -
@RequestMapping(value = "/capture", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void capture(@RequestParam
final Map<String, String> response)
{
// TODO : perform validations first.
captureResponse(response);
}
このペイロードを使用する前に、私はマップのnull以外の値の最初のチェックを含む、その後、チェックサム検証にこれらの値を使用して、非自明な検証を行う必要があります。だから、私は春のバリデータ・インタフェースを使用してプログラム私のペイロードを検証したいと思います。しかし、私は地図を検証するための任意のバリデータの例を見つけることができませんでした。
Javaオブジェクトを検証するため、私は、バリデータが以下のようにバリデータにエラーが含まれているために、オブジェクトとBeanPropertyBindingResultを渡すことによって呼び出される方法を理解します -
final Errors errors = new BeanPropertyBindingResult(object, objectName);
myValidator.validate(object, errors);
if (errors.hasErrors())
{
throw new MyWebserviceValidationException(errors);
}
地図のために、私はそこにあることがわかりますMapBindingResult
拡張するクラスAbstractBindingResult
。私は単にそれを使用し、中に私のマップを渡す必要がありますObject object
し、バリデータでそれがバックキャストMap
?また、どのように検証する方法を考えsupports(final Class<?> clazz)
、私のバリデータで実装しますか?それは単にだけのHashMapのこの一般的なクラスをサポートする1つのバリデータが存在することができるコードスニペット以下のようなものでしょうか?どういうわけか、右感じることはありません。(これは私が私のバリデータを注入するように私には関係してバリデータレジストリから直接ではなく、それを使用しますが、それでも好奇心はありませんが。)
@Override
public boolean supports(final Class<?> clazz)
{
return HashMap.class.equals(clazz);
}
、MapBindingResultがありますので、私は春が検証のために地図を支援しなければならないことを肯定的だし、どのように知っていただきたいと思います。だから、これは移動するための方法であるかどうかを知りたい、または私は間違った方向に向かうと、これを行うためのより良い方法があるのです。
私はアノテーションによって、プログラムではなく、これを行うしたいと思いますのでご注意ください。
私が思ったのと同じように、春Validatorはorg.springframework.validation.Validator
地図のサポートの検証を行います。私は自分自身をそれを試みたが、それは動作します!
私が作成したorg.springframework.validation.MapBindingResult
(グローバル/ルートレベルのエラー・メッセージに)そのマップのため、私は検証する必要があるマップと識別名を渡すことによって。このエラーオブジェクトは、以下のスニペットに示すように、地図とともに検証する、バリデータに渡されます。
final Errors errors = new MapBindingResult(responseMap, "responseMap");
myValidator.validate(responseMap, errors);
if (errors.hasErrors())
{
throw new MyWebserviceValidationException(errors);
}
MapBindingResult
拡張AbstractBindingResult
および方法よりも優先されますgetActualFieldValue
、それは検証されているマップからフィールドを取得するための独自の実装だ与えるために。
private final Map<?, ?> target;
@Override
protected Object getActualFieldValue(String field) {
return this.target.get(field);
}
だから、バリI内で提供されるすべての便利なユーティリティメソッドを使用することができたorg.springframework.validation.ValidationUtils
だけで、我々は標準的なオブジェクト豆バリでの使用などを。例えば -
ValidationUtils.rejectIfEmpty(errors, "checksum", "field.required");
ここで、「チェックサムは、」私のマップ内のキーです。ああ、相続の美しさ!:)
他の非自明な検証のために、私は単に地図にオブジェクトをキャストして、私のカスタム検証コードを書きました。
だから、バリデータは次のようになります -
@Override
public boolean supports(final Class<?> clazz)
{
return HashMap.class.equals(clazz);
}
@Override
public void validate(final Object target, final Errors errors)
{
ValidationUtils.rejectIfEmpty(errors, "transactionId", "field.required");
ValidationUtils.rejectIfEmpty(errors, "checksum", "field.required");
final Map<String, String> response = (HashMap<String, String>) target;
// do custom validations with the map's attributes
// ....
// if validation fails, reject the whole map -
errors.reject("response.map.invalid");
}