Условная проверка бинов
Я использую Bean Validation в своем проекте JSF. Теперь я столкнулся с ситуацией, в которой я хотел бы проверять метод ТОЛЬКО при проверке предыдущего метода.
Я приведу пример:
@AssertTrue(message="{invalidCode}")
private boolean isValidActivationCode() { ... }
if(isValidActivationCode()) {
@AssertTrue(message="{alreadyActivated}")
private boolean isAlreadyActivated() { ... }
}
Поскольку я получу код активации для каждого параметра, я хотел бы сначала проверить его. Если он недействителен, это приведет к нарушению. Если так, я даже не могу проверить, активирован ли он уже (так как код недействителен). Итак, возможно ли достичь чего-то подобного вышеупомянутому (функция if-оператора, я знаю, это не сработает, но показывает, чего я пытаюсь достичь).
заранее спасибо
Обновить
Обходной путь, подобный Ravi K, упоминается:
@AssertTrue(message="{invalidCode}")
private boolean isValidActivationCode() { ... }
@AssertTrue(message="{alreadyActivated}")
private boolean isAlreadyActivated() { return isValidActivationCode() ? ... : true; }
Хотя мне интересно, есть ли чистый способ решить эту проблему? Если никто не даст ответ в ближайшее время, я буду считать, что для этого нет чистого решения, и я приму решение от Ravi K в качестве ответа на эту проблему.
2 ответа
Ну, я не мог углубиться в аннотацию JSF, но мне любопытно, почему вы не можете просто вызвать isValidActivationCode() в isAlreadyActivation (), то есть что-то вроде ниже,
@AssertTrue(message="{invalidCode}")
private boolean isValidActivationCode() { ... }
@AssertTrue(message="{alreadyActivated}")
private boolean isAlreadyActivated() {
if(isValidActivationCode()) {
<Logic for isAlreadyActivated>
)
}
Как вы сказали, если вы считаете, что обходной путь не является хорошим, есть 2 варианта.
1) Используйте тот же обходной путь, но сделайте его более логичным. Измените тип возвращаемого значения isAlreadyActivation () на Boolean вместо Boolean. В методе isAlreadyActivation (), если isValidActivationCode() имеет значение false, возвращает ноль.
http://docs.oracle.com/javaee/6/api/index.html?javax/validation/constraints/package-summary.html
Согласно API выше, null считаются действительными. Таким образом, ваша логика становится более понятной. истина = действительный, ложь = недействительный, ноль = не применимо. Вы можете поместить то же самое в javadoc для этого метода также.
@AssertTrue(message="{invalidCode}")
private boolean isValidActivationCode() { ... }
@AssertTrue(message="{alreadyActivated}")
private Boolean isAlreadyActivated() {
if(isValidActivationCode()) {
<Logic for isAlreadyActivated>
} else {
return null;
}
}
2) Перейти на пользовательские ограничения. @AssertTrue имеет ограничения, и ребята знают, что их недостаточно. Таким образом, они дали право создавать свои собственные. Так что иди на это. Ниже ссылки для того же.
http://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html/validator-customconstraints.html
Валидация JSR 303. Если одно поле равно "чему-то", то эти другие поля не должны быть нулевыми
Я думаю, это все, что у нас есть, выбор за вами:)