2015-11-16 3 views
0

Так класс я делаю проверку 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 во время выполнения. Тьфу.

ТИА,

Еще обучения Стив

ответ

1

См ConstraintViolation#getPropertyPath метод:

/** 
* @return the property path to the value from {@code rootBean} 
*/ 
Path getPropertyPath(); 

Path.Node#getName даст вам имя свойства. Для имен полей во вложенных компонентах вы проходите путь.

+0

Вот и все! Тысяча благодарностей! – user1201168

Смежные вопросы