Проверка бина по методу
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);
}
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>
Результат
beanvalidation.Bean@31c5c3da
Failed test nr. 1
Passed test nr. 2
Passed test nr. 3
2 ответа
examplesMatch() не является допустимым средством получения булевых свойств Java Beans. Это нужно начинать с get или is.
@BalusC, как обычно, дает отличный ответ!
Обратите также внимание: в этом дивном новом мире
jakarta.validation
пространство имен против
javax.validation
, в моем случае я импортировал
AssertTrue
от первого, но мой контейнер (WildFly 26) распознавал только последний.