Java Bean Ограничения проверки (JSR303), связанные с отношениями между несколькими свойствами Bean
Скажем, у меня есть следующая простая java bean:
class MyBean {
private Date startDate;
private Date endDate;
//setter, getters etc...
}
Есть ли механизм в JSR 303 для создания настраиваемого валидатора, который проверяет ограничение, которое startDate должно быть до endDate?
Мне кажется, что это распространенный прецедент, но я не могу найти примеров такого множественного ограничения отношений собственности.
Ответы
Ответ 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 .
Ответ 4
@AssertMethodAsTrue - аннотация многоразового ограничения, которая охватывает несколько свойств.
Ответ 5
Поскольку нет способа доступа к bean в валидаторе JSR 303, это невозможно.
Обходным решением будет предоставление вашего собственного ConstraintValidatorContext
и расширение его ссылкой на bean, которую вы в настоящее время проверяете. Но я не уверен, можете ли вы изменить/переопределить соответствующий factory.