4
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
        }
    }
}

如果我的两个密码都不为空,我的验证将通过,但它们不同。似乎最后一个约束不会被考虑在内,尽管我不知道为什么。有人有建议吗?

不,我不是在搜索 @Matches 或类似自定义验证器的任何实现。我只是想解决这个问题。

提前致谢。

更新 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);
    }

索引.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>

结果

beanvalidation.Bean@31c5c3da

    Failed test nr. 1
    Passed test nr. 2
    Passed test nr. 3 
4

2 回答 2

24

examplesMatch()不是有效的Java Bean布尔属性获取器。它需要以getis开头。

于 2012-10-18T08:45:57.607 回答
0

@BalusC 像往常一样给出了一个很好的答案!

另请注意:在命名jakarta.validation空间与.javax.validationAssertTrue

于 2022-02-24T07:15:52.700 回答