条件Bean验证

时间:2012-10-22 12:56:59

标签: java jsf bean-validation

我在JSF项目中使用Bean Validation。 现在我遇到了一种情况,我想在验证前面的方法时验证方法。

我举一个例子:

@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 个答案:

答案 0 :(得分:2)

正如你所说,如果你认为解决方法不好,那么有2种选择。

1)使用相同的上述解决方法,但使其更合乎逻辑。将isAlreadyActivated()的返回类型更改为布尔值而不是布尔值。在isAlreadyActivated()方法中,如果isValidActivationCode()为false,则返回null。

http://docs.oracle.com/javaee/6/api/index.html?javax/validation/constraints/package-summary.html

根据上述API,null被视为有效。所以你的逻辑变得更加清晰。 true =有效,false =无效,null =不适用。您也可以在该方法的javadoc中添加相同的内容。

 @AssertTrue(message="{invalidCode}")
    private boolean isValidActivationCode() { ... }


    @AssertTrue(message="{alreadyActivated}")
    private Boolean isAlreadyActivated() {

         if(isValidActivationCode()) {
               <Logic for isAlreadyActivated>
          } else {
             return null;
           }

    }

2)转到自定义约束。 @AssertTrue内置于约束&amp; jsf家伙知道他们还不够。所以他们有权创造自己的。所以去吧。请参阅以下链接。

http://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html/validator-customconstraints.html

JSR 303 Validation, If one field equals "something", then these other fields should not be null

我认为这就是我们得到的所有,选择权是你的。)

答案 1 :(得分:1)

嗯,我无法深入了解JSF注释方面,但我很好奇为什么你不能简单地在isAlreadyActivated()中调用isValidActivationCode(),例如下面的内容,

@AssertTrue(message="{invalidCode}")
private boolean isValidActivationCode() { ... }


@AssertTrue(message="{alreadyActivated}")
private boolean isAlreadyActivated() {

     if(isValidActivationCode()) {
           <Logic for isAlreadyActivated>
      )

}