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