我使用Map作爲本地化值,區域設置作爲鍵和字符串作爲值。對於必填字段,我需要檢查是否至少設置了所需的語言環境 - 或者至少設置了一些值。我已經實現了驗證註釋以用於這樣的Map字段和相應的驗證器。問題是,我如何報告缺失值?這是在UI用來綁定字段錯誤/值屬性路徑,順心每次:Javax驗證:約束違規地圖
// 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;
}
}
此錯誤的正確的路徑是「字段[音響]」,但看來我只能訪問索引子屬性。在這種情況下,對象本身被編入索引。我正在使用Hibernate驗證器。
差異是實際驗證錯誤所綁定到的路徑。 Collection_的驗證報告集合級別(語言環境)而不是元素級別(語言環境[1])的所有錯誤。我試圖得到更具體的錯誤(對於Spring綁定)。我收到了一個非常強烈的感覺,這種用例在規範中被忽略了......也就是說,必須使用bean而不是索引文件。 – 2012-08-09 13:11:52