로캘을 키로, 문자열을 값으로 사용하여 지역화 된 값에 Map을 사용합니다. 필수 필드의 경우 최소한 필수 로케일이 설정되어 있는지 확인하거나 적어도 일부 값이 설정되어 있는지 확인해야합니다. 필자는 Map 필드와 해당 유효성 검사기에서 사용할 유효성 검사 주석을 구현했습니다. 문제는 누락 된 값을 어떻게보고 할 수 있는가입니다.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;
}
}
이 오류의 정확한 경로 "필드 [Fi를]"이다하지만 I 단지 인덱스 서브 속성을 액세스 할 수있는 표시 : 필드 오류/값을 바인딩하는 UI에 사용되는 속성 경로마다 잘못 . 이 경우 개체 자체가 인덱싱됩니다. 나는 Hibernate Validator를 사용하고있다.
차이점은 실제 유효성 검사 오류가 바인딩되는 경로입니다. _ Collection_Valueation은 요소 수준 (로캘 [1]) 대신 컬렉션 수준 (로캘)의 모든 오류를보고합니다. 더 구체적인 오류 (스프링 바인딩 용)를 얻으려고했습니다. 이런 종류의 사용 사례가 스펙에서 간과되었다는 느낌이 강해졌습니다. 즉, 인덱스 파일 대신 빈을 사용해야합니다. –