Условная проверка бинов

Я использую 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. Если одно поле равно "чему-то", то эти другие поля не должны быть нулевыми

Я думаю, это все, что у нас есть, выбор за вами:)

Другие вопросы по тегам