我使用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