2012-10-22 67 views
0

我在我的JSF項目中使用Bean驗證。 現在我遇到了一種情況,我只想在驗證前面的方法時驗證方法。有條件的Bean驗證

我舉一個例子:

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

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

因爲我將每個參數收到激活碼,我想先驗證它。如果無效,將導致違規。如果是這樣,我甚至不能檢查它是否已經被激活(因爲代碼是無效的)。 那麼,是否有可能實現上述提到的任何東西(if語句的功能,我知道這不會起作用,但它顯示了我正在嘗試完成的任務)。

在此先感謝

更新

解決辦法像拉維ķ提到:

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

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

雖然我不知道,有沒有辦法解決這個乾淨的方法嗎? 如果沒有人很快提供答案,我會認爲沒有乾淨的解決方案,我會接受來自Ravi K的解決方法作爲解決此問題的答案。

回答

1

嗯,我無法進入在JSF註釋側多深,但我很好奇,爲什麼你不能簡單地調用isValidActivationCode()在isAlreadyActivated()也即類似下面,

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


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

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

} 
+0

因爲這樣的方法isAlreadyActivated仍然會執行,我的信息還是會被拋出。只有這樣我才能操縱這個,如果代碼無效,總是會拋出true,所以這絕不會導致違規。但是,這就像一個解決方法,而不是一個很好的解決方案,不是嗎? – Aquillo

+0

是的你是對的,這只是一個解決方法。如果你想要尋求完美的解決方案,那麼這將變得更加困難。在下一個答案中,讓我給你2個更多選項。 –

2

由於你說,如果你覺得解決方法不好,那麼有2個選項。

1)與上面的解決方法一樣,但使其更合乎邏輯。將返回類型isAlreadyActivated()更改爲布爾值而非布爾值。如果isValidActivationCode()爲false,則在isAlreadyActivated()方法中,然後返回null。

http://docs.oracle.com/javaee/6/api/index.html?javax/validation/constraints/package-summary.html

按照上述API,零被認爲是有效的。所以你的邏輯變得更清晰。 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

我認爲是我們所得到的,選擇是你的:)

+0

似乎沒有這方面的開箱即用解決方案。我感謝您的額外研究,我一直在處理我的解決方法,但我會使用您的'null'解決方案,因爲它只是一個更好的輸出。 稍後,我會在自定義驗證器中付出一些努力,但我認爲現在我可以在這個項目中以更好的方式投入我的時間。 如上所述,謝謝拉維。 – Aquillo