Подтвердить что ты не робот

Java Bean Ограничения проверки (JSR303), связанные с отношениями между несколькими свойствами Bean

Скажем, у меня есть следующая простая java bean:

class MyBean {
   private Date startDate;
   private Date endDate;
   //setter, getters etc...
}

Есть ли механизм в JSR 303 для создания настраиваемого валидатора, который проверяет ограничение, которое startDate должно быть до endDate?

Мне кажется, что это распространенный прецедент, но я не могу найти примеров такого множественного ограничения отношений собственности.

4b9b3361

Ответ 1

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

Вы можете создать Constraint с целью самого типа с соответствующим валидатором:

@ValidateDateRange(start="startDate", end="endDate")
public class MyBean {

Вы можете инкапсулировать диапазон дат в типе и подтвердить, что:

public class DateRange {    
  private long start;
  private long end;

  public void setStart(Date start) {
    this.start = start.getTime();
  }

  // etc.

Вы можете добавить простое свойство, которое выполняет проверку:

public class MyBean {
  private Date startDate;
  private Date endDate;

  @AssertTrue public boolean isValidRange() {
    // TODO: null checks
    return endDate.compareTo(startDate) >= 0;
  }

Ответ 2

Если вы используете Hibernate Validator в версии 4.1 или новее, вы можете использовать @ScriptAssert вместе со сценарием или языком выражений, чтобы выразить такое ограничение. С помощью JavaScript ваш пример будет выглядеть так:

 @ScriptAssert(lang = "javascript", script = "_this.startDate.before(_this.endDate)")
 public class CalendarEvent {

      private Date startDate;

      private Date endDate;

      //...
 } 

Вы можете получить еще более компактный синтаксис создание пользовательского ограничения для языка script по вашему выбору:

@JexlAssert("_.startDate < _.endDate")
public class CalendarEvent {

    private Date startDate;

    private Date endDate;

    //...
}

Ответ 3

Ответ - это валидатор уровня класса. Вы можете определить пользовательские ограничения, которые вы можете разместить в классе сущностей. Во время проверки вы передадите весь экземпляр в метод isValid(). Затем вы можете сравнить свои две даты друг против друга. См. Также документацию Hibernate Validator .

Ответ 5

Поскольку нет способа доступа к bean в валидаторе JSR 303, это невозможно.

Обходным решением будет предоставление вашего собственного ConstraintValidatorContext и расширение его ссылкой на bean, которую вы в настоящее время проверяете. Но я не уверен, можете ли вы изменить/переопределить соответствующий factory.