Skip to content

Commit

Permalink
fix: Binder.validate() no longer fails in buffered mode when bean-lev…
Browse files Browse the repository at this point in the history
…el validations are defined. Fixes #18120
  • Loading branch information
mvysny committed Nov 24, 2023
1 parent 101b9c2 commit 6f09365
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2588,16 +2588,11 @@ public BinderValidationStatus<BEAN> validate() {
*
*/
protected BinderValidationStatus<BEAN> validate(boolean fireEvent) {
if (getBean() == null && !validators.isEmpty()) {
throw new IllegalStateException("Cannot validate binder: "
+ "bean level validators have been configured "
+ "but no bean is currently set");
}
List<BindingValidationStatus<?>> bindingStatuses = validateBindings();

BinderValidationStatus<BEAN> validationStatus;
if (validators.isEmpty() || bindingStatuses.stream()
.anyMatch(BindingValidationStatus::isError)) {
if (validators.isEmpty() || getBean() == null || bindingStatuses
.stream().anyMatch(BindingValidationStatus::isError)) {
validationStatus = new BinderValidationStatus<>(this,
bindingStatuses, Collections.emptyList());
} else {
Expand Down
12 changes: 12 additions & 0 deletions flow-data/src/main/java/com/vaadin/flow/data/binder/Validator.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,18 @@ static <T> Validator<T> alwaysPass() {
return (value, context) -> ValidationResult.ok();
}

/**
* Returns a validator that fails on any value.
*
* @param <T>
* the value type
* @return an always-failing validator
*/
static <T> Validator<T> alwaysFail(String errorMessage) {
Objects.requireNonNull(errorMessage);
return (value, context) -> ValidationResult.error(errorMessage);
}

/**
* Builds a validator out of a conditional function and an error message. If
* the function returns true, the validator returns {@code Result.ok()}; if
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1116,14 +1116,14 @@ public void isValidTest_unbound_binder() {
Assert.assertTrue(binder.isValid());
}

@Test(expected = IllegalStateException.class)
public void isValidTest_unbound_binder_throws_with_bean_level_validation() {
@Test
public void isValidTest_unbound_binder_passes_with_bean_level_validation() {
binder.forField(nameField).bind(Person::getFirstName,
Person::setFirstName);
binder.withValidator(Validator.from(
person -> !person.getFirstName().equals("fail bean validation"),
""));
binder.isValid();
Assert.assertTrue(binder.isValid());
}

@Test
Expand Down Expand Up @@ -1402,20 +1402,22 @@ public void beanvalidation_initially_broken_bean() {
Assert.assertFalse(binder.validate().isOk());
}

@Test(expected = IllegalStateException.class)
public void beanvalidation_isValid_throws_with_readBean() {
@Test
public void beanvalidation_isValid_passes_with_readBean() {
TestTextField lastNameField = new TestTextField();
setBeanValidationFirstNameNotEqualsLastName(nameField, lastNameField);
binder.withValidator(Validator.alwaysFail("fail"));

binder.readBean(item);

Assert.assertTrue(binder.isValid());
}

@Test(expected = IllegalStateException.class)
public void beanvalidation_validate_throws_with_readBean() {
@Test
public void beanvalidation_validate_passes_with_readBean() {
TestTextField lastNameField = new TestTextField();
setBeanValidationFirstNameNotEqualsLastName(nameField, lastNameField);
binder.withValidator(Validator.alwaysFail("fail"));

binder.readBean(item);

Expand Down

0 comments on commit 6f09365

Please sign in to comment.