0

我在我的 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 的解决方法作为这个问题的答案。

4

2 回答 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 是内置的约束 & jsf 家伙知道他们还不够。所以他们有特权创造你自己的。所以去吧。请参阅下面的链接。

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

JSR 303 验证,如果一个字段等于“某物”,则这些其他字段不应为空

我想这就是我们所得到的,选择是你的:)

于 2012-10-23T05:50:40.437 回答
1

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

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


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

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

}
于 2012-10-22T13:22:54.690 回答