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

Скажем, у меня есть следующий простой боб Java:

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

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

Мне кажется, это общий случай использования, но я не могу найти никаких примеров такого рода ограничений на отношения между несколькими свойствами.

 Ralph20 июл. 2015 г., 19:27
Похоже, кто-то опубликовал полный пример в своем блоге:soadev.blogspot.de/2010/01/jsr-303-bean-validation_29.html

Ответы на вопрос(5)

Решение Вопроса

Вы могли бы создать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;
  }

это невозможно.

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

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

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

      private Date startDate;

      private Date endDate;

      //...
 } 

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

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

    private Date startDate;

    private Date endDate;

    //...
}

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

 gevorg09 июн. 2016 г., 13:35
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.

Ваш ответ на вопрос