2009-11-09 1 views
21

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

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

Существует ли механизм в JSR 303, чтобы создать пользовательский валидатор, который проверяет ограничение, STARTDATE должно быть до конца?

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

+1

Это швы, что кто-то разместил полный пример в его blog: http://soadev.blogspot.de/2010/01/jsr-303-bean-validation_29.html – Ralph

ответ

27

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

Вы можете создать 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; 
    } 
-5

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

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

3

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

1
+2

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – gevorg

10

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

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

     private Date startDate; 

     private Date endDate; 

     //... 
} 

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

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

    private Date startDate; 

    private Date endDate; 

    //... 
} 

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

  • Нет связанных вопросов^_^