条件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,如果一个字段等于“某事”,那么这些其他字段不应为空
我认为这就是我们得到的,选择是你的:)