【问题标题】:Conditional Bean Validation条件 Bean 验证
【发布时间】:2012-10-12 07:02:58
【问题描述】:

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

我举个例子:

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

【问题讨论】:

    标签: java jsf bean-validation


    【解决方案1】:

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

    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 Validation, If one field equals "something", then these other fields should not be null

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

    【讨论】:

    • 似乎没有开箱即用的解决方案。感谢您的额外研究,我一直在使用我的解决方法,但我会使用您的null-solution,因为它只是感觉更好的输出。稍后我将在自定义验证器上投入一些精力,尽管我认为我现在可以将时间以更好的方式投入到这个项目中。如前所述,谢谢拉维。
    【解决方案2】:

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

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

    【讨论】:

    • 因为这种方式isAlreadyActivated方法还是会被执行,我的消息还是会被抛出。我可以操纵它的唯一方法是在无效代码的情况下始终抛出 true,因此这永远不会导致违规。但这更像是一种解决方法,而不是一个很好的修复,不是吗?
    • 是的,你是对的,这只是一种解决方法。如果你想寻求完美的解决方案,那就更难了。让我在下一个答案中再给你 2 个选项。
    猜你喜欢
    • 2019-02-03
    • 2011-01-29
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多