Так класс я делаю проверку JSR-303 боба на два поля с одинаковым рисунком ограничение применяется к каждому:приобретают имя поля ошибки проверки боб
@Column(name="test_suite_revision")
@XmlElement(name="test_suite_revision")
@NotNull
@Pattern(regexp = "\\d\\d-\\d\\d-\\d\\d\\d\\d", message = "value must be of the form xx-xx-xxxx")
private String revisionTestSuite;
@Column(name="test_revision")
@XmlElement(name="test_revision")
@NotNull
@Pattern(regexp = "\\d\\d-\\d\\d-\\d\\d\\d\\d", message = "value must be of the form xx-xx-xxxx")
private String revisionTest;
ВАЖНО - этот класс не класс поддержки формы в классическом Spring MVC webapp, но класс сущности, который живет в основе веб-службы. Таким образом, проверка выполняется в сервисе.
Теперь веб-клиент, который потребляет веб-службу, является Spring MVC и имеет компонент, поддерживающий форму, который связан с jsp с местами для размещения сообщений об ошибках.
Итак, предположим, что пользователь вводит неверно отформатированную строку в одно из двух полей. Я могу ловушкой для него с этим довольно стандартным фрагменте кода
Set<ConstraintViolation<TestCase>> violations = validator.validate(permit);
if(!violations.isEmpty()) {
logger.debug("basic validation FAILED with " + violations.size() + " errors");
Iterator<ConstraintViolation<TestCase>> iter = violations.iterator();
while(iter.hasNext()) {
ConstraintViolation<TestCase> cv = iter.next();
logger.debug("invalidValue:" + cv.getInvalidValue());
logger.debug("message:" + cv.getMessage());
ConstraintDescriptor<?> cd = cv.getConstraintDescriptor();
Map<String, Object> mapp = cd.getAttributes();
for(String keey : mapp.keySet()) {
logger.debug("mapp key:" + keey + ":" + mapp.get(keey));
}
который выписывает
basic validation FAILED with 1 errors
invalidValue:050607
message:value must be of the form xx-xx-xxxx
mapp key:message:value must be of the form xx-xx-xxxx
mapp key:payload:[Ljava.lang.Class;@1367702
mapp key:flags:[Ljavax.validation.constraints.Pattern$Flag;@bf5210
mapp key:groups:[Ljava.lang.Class;@a49be5
mapp key:regexp:\d\d-\d\d-\d\d\d\d
Вот загвоздка: Как один выяснить, какие поля не прошел проверку? Кажется, я не могу найти способ получить имя поля, «ревизия» или «revisionTestSuite» из объекта ConstraintViolation или объекта ConstraintDescritpor.
метод getValidationAppliesTo(), недавно доступный в версии 1.1.0.Final javax.validation-api кажется многообещающим, но до сих пор этот метод генерирует AbstractMethodError во время выполнения. Тьфу.
ТИА,
Еще обучения Стив
Вот и все! Тысяча благодарностей! – user1201168