ロケールをキー、文字列を値として、ローカライズされた値に Map を使用します。必須フィールドについては、少なくとも必要なロケールが設定されていること、または少なくともいくつかの値が設定されていることを確認する必要があります。そのような Map フィールドと対応するバリデーターで使用される検証アノテーションを実装しました。問題は、欠損値を報告するにはどうすればよいかということです。フィールド エラー/値をバインドするために UI で使用されるプロパティ パスは、毎回間違っています。
// Domain object:
@LocalizationRequired
private Map<Locale, String> field;
// LocalizationRequiredValidator:
public boolean isValid(Map<Locale, String> map, ConstraintValidatorContext context) {
if (requiredLocales.isEmpty()) {
// Check that there exists any not null value
} else {
context.disableDefaultConstraintViolation();
boolean valid = true;
for (Locale requiredLocale : requiredLocales) {
if (map.get(requiredLocale) == null) { // e.g. fi
valid = false;
context.buildConstraintViolationWithTemplate("LocalizationRequired")
// These end up in wrong property path:
// .addNode(requiredLocale)
// --> field.fi
// .addNode("[" + requiredLocale + "]")
// --> field.[fi]
// .addNode(null).addNode(requiredLocale).inIterable()
// --> field.fi
// .addNode(null).addNode(null).inIterable().atKey(requiredLocale)
// --> field
.addConstraintViolation();
}
}
return valid;
}
}
このエラーの正しいパスは「field[fi]」ですが、インデックス付きのサブ プロパティにしかアクセスできないようです。この場合、オブジェクト自体にインデックスが付けられます。Hibernate Validator を使用しています。