Я использую Map для локализованных значений с локалью в качестве ключа и String в качестве значения. Для обязательных полей мне нужно проверить, установлены ли по крайней мере требуемые языковые стандарты или, по крайней мере, установлено какое-то значение. Я реализовал аннотацию проверки, которая будет использоваться в таких полях карты, и соответствующий валидатор. Проблема в том, как я могу сообщить об отсутствующем значении? Путь к свойству, который используется в пользовательском интерфейсе для привязки ошибок / значений полей, каждый раз ошибается:
// 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.