2012-10-17 107 views
0
public class Register { 
    @NotNull private String password; 
    @NotNull private String passwordRepeat; 
    @AssertTrue private boolean comparePasswords() { 
     return password.equals(passwordRepeat); 
    } 

    private Set<ConstraintViolation<Register>> violations; 

    public void doRegister(AjaxBehaviorEvent event) { 
     Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
     violations = validator.validate(this); 

     if(violations.isEmpty()) { 
      // This occurs 
     } 
    } 
} 

如果我的密碼不爲空,但它們不同,我的驗證將通過。 好像最後一個約束不會被考慮在內,但我不知道爲什麼。有沒有人有建議?方法上的Bean驗證

不,我不搜索任何@Matches或simular自定義驗證器的實現。我只是想解決這個問題。

在此先感謝。

更新1

我遇到這方面的一些測試,希望結果將提供必要的信息。

Bean.java

@Named 
@RequestScoped 
public class Bean { 
    @NotNull private String example1; 
    @NotNull private String example2; 
    @AssertTrue private boolean examplesMatch() { return example1.equals(example2); } 

    private Set<ConstraintViolation<Bean>> violations; 
    private FacesContext context; 
    private Validator validator; 

    @PostConstruct 
    public void init() { 
     context = FacesContext.getCurrentInstance(); 
     validator = Validation.buildDefaultValidatorFactory().getValidator(); 

     example1 = "abc"; 
     example2 = "def"; 
     runValidation(false, 1); 

     example1 = "abc"; 
     example2 = "abc"; 
     runValidation(true, 2); 

     example1 = "abc"; 
     example2 = null; 
     runValidation(false, 3); 
    } 

    private void runValidation(boolean assertion, int testNr) { 
     FacesMessage message; 
     violations = validator.validate(this); 
     if(violations.isEmpty() == assertion) { 
      message = new FacesMessage("Passed test nr. " + testNr); 
     } 
     else { 
      message = new FacesMessage("Failed test nr. " + testNr); 
     } 
     context.addMessage(FacesMessage.FACES_MESSAGES, message); 
    } 

的index.xhtml

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html"> 
    <head> 
     <title>TODO supply a title</title> 
    </head> 
    <body> 
     #{bean} 
     <h:messages /> 
    </body> 
</html> 

結果

[email protected] 

    Failed test nr. 1 
    Passed test nr. 2 
    Passed test nr. 3 
+0

爲什麼使用註釋。只需要布爾方法,其中您可以有空檢查,然後在空檢查內比較兩個字符串。 –

+0

你使用的是什麼驗證模式? –

+0

@TheDarkKnight因爲這只是一個較大的類的相關示例。 – Aquillo

回答

9

examplesMatch()不是有效的Java Beans布爾屬性getter。它需要從得到

+0

令人難以置信的是,經過幾小時的搜索,我在2分鐘前發現了這一點。來到這裏回答我自己的問題。雖然,你的答案是有效的,並且是第一個值得接受的。感謝您的努力! – Aquillo

+0

在這裏,我深深地陷入了兔子洞,想着我可能必須找到一種方法來驅逐beanMetaDataManager的緩存...... – Morgan