条件Beanvalidation

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

我举个例子:

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

由于我将收到每个参数的激活码,我想先validation它。 如果它无效,则会导致违规。 如果是这样,我甚至无法检查它是否已被激活(因为代码无效)。 那么,是否有可能实现上述任何内容(if语句的function,我知道这不会起作用,但它显示了我想要完成的任务)。

提前致谢

更新

像Ravi K这样的解决方法提到:

 @AssertTrue(message="{invalidCode}") private boolean isValidActivationCode() { ... } @AssertTrue(message="{alreadyActivated}") private boolean isAlreadyActivated() { return isValidActivationCode() ? ... : true; } 

虽然我想知道,有没有一个干净的方法来解决这个问题? 如果没有人能尽快给出答案,我将假设没有干净的解决方案,我将接受Ravi K的解决方法作为这个问题的答案。

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

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

正如你所说,如果你觉得解决方法不好,那么有两种选择。

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()) {  } else { return null; } } 

2)去自定义约束。 @AssertTrue是在约束中构建的,jsf知道他们还不够。 所以他们有权创造自己的。 那就去吧。 请参阅以下链接。

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

JSR 303validation,如果一个字段等于“某事”,那么这些其他字段不应为空

我认为这就是我们得到的,选择是你的:)