JSR303: Пытаюсь настроить нарушение ограничения, которое будет связано с подпутьем в валидаторе ограничений отношения на уровне класса

Я использую JSR303 и создал ограничение уровня класса, которое сравнивает пароль и его подтверждение в форме, которую я здесь назову ограничением @SameAs. В идеале я хотел бы связать ограничение с намеченной целью (confirmPassword), но очевидно, что включающий bean-компонент недоступен для извлечения свойства пароля. - отсюда и ограничение на уровне класса.

Я с интересом прочитал другие сообщения, демонстрирующие, как использовать ограничения на уровне класса для проверки отношений, но не могу найти ничего, объясняющего, как нарушение ограничения может быть настроено для связывания с подпути, в данном случае с одним из два поля во взаимосвязи.

У меня следующий вопрос: как связать сообщение о нарушении ограничения с полем «confirmPassword» вместо объекта верхнего уровня? Я попытался использовать параметр контекста javax.Validator.validate (target, context), но добавление узла в валидаторе для @SameAs вызывает исключение для следующего ограничения в каскаде (попытка извлечь свойство confirmPassword -> orderNumber вместо order -> orderNumber) в результате.

На данный момент я прибег к уродливому кладжу, создав дополнительное свойство, хранящее сообщение об ограничении, которое извлекается для использования рядом с полем ввода confirmPassword на веб-слое.

Конечно, я что-то здесь упускаю ... . см. пример ниже

Спасибо за любые комментарии

ПРИМЕР

@Constraint( validatedBy = { SamePwdAsValidator.class})
public interface SamePwdAs {//...
}

//Using passwords in an order doesn't make sense - only for demo purpose
@SamePwdAs( message = "Password and confirmation must match" ...)
public class Order {

    @NotNull
    @Size(....)
    String pwd;

    //where I would really like to use @SameAs, and associate a violation 
    String pwdConfirm;

    @NotNull (...)
    @Pattern (....)
    String orderNumber;

    //...getters/setters
}

public class SamePwdAsValidator implements javax.validation.Validator {
//...
  public boolean isValid( Object target, ValidationContext ctx) {
   String tgt = target.getPwd(), other = target.getPwdConfirm()
   boolean isValid = tgt.equals( other);

   if ( !isValid) {
      //try to configure the context subpath for pwdConfirm to associate this constraint violation with: I tried 
      //ctx.addNode( 'pwdConfirm').addConstraintViolation() which doesn't work, as the next validator will
      //bump into trying to extract Order.pwdConfirm.orderNumber and throw a NoPropertyFoundException or the like
   }

   return isValid;
}
6
задан skaffman 20 December 2011 в 23:00
поделиться