123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729 |
- /*
- * Copyright 2000-2016 Vaadin Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
- package com.vaadin.data;
-
- import static org.junit.Assert.assertEquals;
- import static org.junit.Assert.assertFalse;
- import static org.junit.Assert.assertNotNull;
- import static org.junit.Assert.assertNull;
- import static org.junit.Assert.assertTrue;
-
- import java.util.List;
- import java.util.concurrent.atomic.AtomicBoolean;
-
- import org.junit.Assert;
- import org.junit.Before;
- import org.junit.Test;
-
- import com.vaadin.data.Binder.Binding;
- import com.vaadin.data.Binder.BindingBuilder;
- import com.vaadin.data.util.converter.StringToIntegerConverter;
- import com.vaadin.data.util.converter.ValueContext;
- import com.vaadin.data.validator.NotEmptyValidator;
- import com.vaadin.server.AbstractErrorMessage;
- import com.vaadin.server.ErrorMessage;
- import com.vaadin.server.SerializablePredicate;
- import com.vaadin.server.UserError;
- import com.vaadin.tests.data.bean.Person;
- import com.vaadin.ui.Label;
- import com.vaadin.ui.TextField;
-
- public class BinderConverterValidatorTest
- extends BinderTestBase<Binder<Person>, Person> {
-
- private static class StatusBean {
- private String status;
-
- public String getStatus() {
- return status;
- }
-
- public void setStatus(String status) {
- this.status = status;
- }
-
- }
-
- @Before
- public void setUp() {
- binder = new Binder<>();
- item = new Person();
- item.setFirstName("Johannes");
- item.setAge(32);
- }
-
- @Test
- public void validate_notBound_noErrors() {
- BinderValidationStatus<Person> status = binder.validate();
-
- assertTrue(status.isOk());
- }
-
- @Test
- public void bound_validatorsAreOK_noErrors() {
- BindingBuilder<Person, String> binding = binder.forField(nameField);
- binding.withValidator(Validator.alwaysPass()).bind(Person::getFirstName,
- Person::setFirstName);
-
- nameField.setComponentError(new UserError(""));
- BinderValidationStatus<Person> status = binder.validate();
-
- assertTrue(status.isOk());
- assertNull(nameField.getComponentError());
- }
-
- @SuppressWarnings("serial")
- @Test
- public void bound_validatorsFail_errors() {
- BindingBuilder<Person, String> binding = binder.forField(nameField);
- binding.withValidator(Validator.alwaysPass());
- String msg1 = "foo";
- String msg2 = "bar";
- binding.withValidator((String value,
- ValueContext context) -> ValidationResult.error(msg1));
- binding.withValidator(value -> false, msg2);
- binding.bind(Person::getFirstName, Person::setFirstName);
-
- BinderValidationStatus<Person> status = binder.validate();
- List<ValidationStatus<?>> errors = status.getFieldValidationErrors();
-
- assertEquals(1, errors.size());
-
- ValidationStatus<?> validationStatus = errors.stream().findFirst()
- .get();
- String msg = validationStatus.getMessage().get();
- assertEquals(msg1, msg);
-
- HasValue<?> field = validationStatus.getField();
-
- assertEquals(nameField, field);
-
- ErrorMessage componentError = nameField.getComponentError();
- assertNotNull(componentError);
- assertEquals("foo",
- ((AbstractErrorMessage) componentError).getMessage());
- }
-
- @Test
- public void validatorForSuperTypeCanBeUsed() {
- // Validates that a validator for a super type can be used, e.g.
- // validator for Number can be used on a Double
-
- TextField salaryField = new TextField();
- Validator<Number> positiveNumberValidator = (value, context) -> {
- if (value.doubleValue() >= 0) {
- return ValidationResult.ok();
- } else {
- return ValidationResult.error(NEGATIVE_ERROR_MESSAGE);
- }
- };
- binder.forField(salaryField)
- .withConverter(Double::valueOf, String::valueOf)
- .withValidator(positiveNumberValidator)
- .bind(Person::getSalaryDouble, Person::setSalaryDouble);
-
- Person person = new Person();
- binder.setBean(person);
- salaryField.setValue("10");
- assertEquals(10, person.getSalaryDouble(), 0);
- salaryField.setValue("-1"); // Does not pass validator
- assertEquals(10, person.getSalaryDouble(), 0);
- }
-
- @Test
- public void convertInitialValue() {
- bindAgeWithValidatorConverterValidator();
- assertEquals("32", ageField.getValue());
- }
-
- @Test
- public void convertToModelValidAge() {
- bindAgeWithValidatorConverterValidator();
-
- ageField.setValue("33");
- assertEquals(33, item.getAge());
- }
-
- @Test
- public void convertToModelNegativeAgeFailsOnFirstValidator() {
- bindAgeWithValidatorConverterValidator();
-
- ageField.setValue("");
- assertEquals(32, item.getAge());
- assertValidationErrors(binder.validate(), EMPTY_ERROR_MESSAGE);
- }
-
- private void assertValidationErrors(
- List<ValidationStatus<?>> validationErrors,
- String... errorMessages) {
- assertEquals(errorMessages.length, validationErrors.size());
- for (int i = 0; i < errorMessages.length; i++) {
- assertEquals(errorMessages[i],
- validationErrors.get(i).getMessage().get());
- }
- }
-
- private void assertValidationErrors(BinderValidationStatus<Person> status,
- String... errorMessages) {
- assertValidationErrors(status.getFieldValidationErrors(),
- errorMessages);
- }
-
- @Test
- public void convertToModelConversionFails() {
- bindAgeWithValidatorConverterValidator();
- ageField.setValue("abc");
- assertEquals(32, item.getAge());
- assertValidationErrors(binder.validate(), NOT_NUMBER_ERROR_MESSAGE);
- }
-
- @Test
- public void convertToModelNegativeAgeFailsOnIntegerValidator() {
- bindAgeWithValidatorConverterValidator();
-
- ageField.setValue("-5");
- assertEquals(32, item.getAge());
- assertValidationErrors(binder.validate(), NEGATIVE_ERROR_MESSAGE);
- }
-
- @Test
- public void convertDataToField() {
- bindAgeWithValidatorConverterValidator();
- binder.getBean().get().setAge(12);
- binder.readBean(binder.getBean().get());
- assertEquals("12", ageField.getValue());
- }
-
- @Test
- public void convertNotValidatableDataToField() {
- bindAgeWithValidatorConverterValidator();
- binder.getBean().get().setAge(-12);
- binder.readBean(binder.getBean().get());
- assertEquals("-12", ageField.getValue());
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void convertInvalidDataToField() {
- TextField field = new TextField();
- StatusBean bean = new StatusBean();
- bean.setStatus("1");
- Binder<StatusBean> binder = new Binder<>();
-
- BindingBuilder<StatusBean, String> binding = binder.forField(field)
- .withConverter(presentation -> {
- if (presentation.equals("OK")) {
- return "1";
- } else if (presentation.equals("NOTOK")) {
- return "2";
- }
- throw new IllegalArgumentException(
- "Value must be OK or NOTOK");
- }, model -> {
- if (model.equals("1")) {
- return "OK";
- } else if (model.equals("2")) {
- return "NOTOK";
- } else {
- throw new IllegalArgumentException(
- "Value in model must be 1 or 2");
- }
- });
- binding.bind(StatusBean::getStatus, StatusBean::setStatus);
- binder.setBean(bean);
-
- bean.setStatus("3");
- binder.readBean(bean);
- }
-
- @Test
- public void validate_failedBeanValidatorWithoutFieldValidators() {
- binder.forField(nameField).bind(Person::getFirstName,
- Person::setFirstName);
-
- String msg = "foo";
- binder.withValidator(Validator.from(bean -> false, msg));
- Person person = new Person();
- binder.setBean(person);
-
- List<ValidationStatus<?>> errors = binder.validate()
- .getFieldValidationErrors();
- assertEquals(0, errors.size());
- }
-
- @Test
- public void validate_failedBeanValidatorWithFieldValidator() {
- String msg = "foo";
-
- BindingBuilder<Person, String> binding = binder.forField(nameField)
- .withValidator(new NotEmptyValidator<>(msg));
- binding.bind(Person::getFirstName, Person::setFirstName);
-
- binder.withValidator(Validator.from(bean -> false, msg));
- Person person = new Person();
- binder.setBean(person);
-
- List<ValidationStatus<?>> errors = binder.validate()
- .getFieldValidationErrors();
- assertEquals(1, errors.size());
- ValidationStatus<?> error = errors.get(0);
- assertEquals(msg, error.getMessage().get());
- assertEquals(nameField, error.getField());
- }
-
- @Test
- public void validate_failedBothBeanValidatorAndFieldValidator() {
- String msg1 = "foo";
-
- BindingBuilder<Person, String> binding = binder.forField(nameField)
- .withValidator(new NotEmptyValidator<>(msg1));
- binding.bind(Person::getFirstName, Person::setFirstName);
-
- String msg2 = "bar";
- binder.withValidator(Validator.from(bean -> false, msg2));
- Person person = new Person();
- binder.setBean(person);
-
- List<ValidationStatus<?>> errors = binder.validate()
- .getFieldValidationErrors();
- assertEquals(1, errors.size());
-
- ValidationStatus<?> error = errors.get(0);
-
- assertEquals(msg1, error.getMessage().get());
- assertEquals(nameField, error.getField());
- }
-
- @Test
- public void validate_okBeanValidatorWithoutFieldValidators() {
- binder.forField(nameField).bind(Person::getFirstName,
- Person::setFirstName);
-
- String msg = "foo";
- binder.withValidator(Validator.from(bean -> true, msg));
- Person person = new Person();
- binder.setBean(person);
-
- assertFalse(binder.validate().hasErrors());
- assertTrue(binder.validate().isOk());
- }
-
- @Test
- public void binder_saveIfValid() {
- String msg1 = "foo";
- BindingBuilder<Person, String> binding = binder.forField(nameField)
- .withValidator(new NotEmptyValidator<>(msg1));
- binding.bind(Person::getFirstName, Person::setFirstName);
-
- String beanValidatorErrorMessage = "bar";
- binder.withValidator(
- Validator.from(bean -> false, beanValidatorErrorMessage));
- Person person = new Person();
- String firstName = "first name";
- person.setFirstName(firstName);
- binder.readBean(person);
-
- nameField.setValue("");
- assertFalse(binder.writeBeanIfValid(person));
- // check that field level-validation failed and bean is not updated
- assertEquals(firstName, person.getFirstName());
-
- nameField.setValue("new name");
-
- assertFalse(binder.writeBeanIfValid(person));
- // Bean is updated but reverted
- assertEquals(firstName, person.getFirstName());
- }
-
- @Test
- public void updateBoundField_bindingValdationFails_beanLevelValidationIsNotRun() {
- bindAgeWithValidatorConverterValidator();
- bindName();
-
- AtomicBoolean beanLevelValidationRun = new AtomicBoolean();
- binder.withValidator(Validator
- .from(bean -> beanLevelValidationRun.getAndSet(true), ""));
-
- ageField.setValue("not a number");
-
- assertFalse(beanLevelValidationRun.get());
-
- nameField.setValue("foo");
- assertFalse(beanLevelValidationRun.get());
- }
-
- @Test
- public void updateBoundField_bindingValdationSuccess_beanLevelValidationIsRun() {
- bindAgeWithValidatorConverterValidator();
- bindName();
-
- AtomicBoolean beanLevelValidationRun = new AtomicBoolean();
- binder.withValidator(Validator
- .from(bean -> beanLevelValidationRun.getAndSet(true), ""));
-
- ageField.setValue(String.valueOf(12));
-
- assertTrue(beanLevelValidationRun.get());
- }
-
- @Test
- public void binderHasChanges() throws ValidationException {
- binder.forField(nameField)
- .withValidator(Validator.from(name -> !"".equals(name),
- "Name can't be empty"))
- .bind(Person::getFirstName, Person::setFirstName);
- assertFalse(binder.hasChanges());
- binder.setBean(item);
- assertFalse(binder.hasChanges());
-
- // Bound binder + valid user changes: hasChanges == false
- nameField.setValue("foo");
- assertFalse(binder.hasChanges());
-
- nameField.setValue("bar");
- binder.writeBeanIfValid(new Person());
- assertFalse(binder.hasChanges());
-
- // Bound binder + invalid user changes: hasChanges() == true
- nameField.setValue("");
- binder.writeBeanIfValid(new Person());
- assertTrue(binder.hasChanges());
-
- // Read bean resets hasChanges
- binder.readBean(item);
- assertFalse(binder.hasChanges());
-
- // Removing a bound bean resets hasChanges
- nameField.setValue("");
- assertTrue(binder.hasChanges());
- binder.removeBean();
- assertFalse(binder.hasChanges());
-
- // Unbound binder + valid user changes: hasChanges() == true
- nameField.setValue("foo");
- assertTrue(binder.hasChanges());
-
- // successful writeBean resets hasChanges to false
- binder.writeBeanIfValid(new Person());
- assertFalse(binder.hasChanges());
-
- // Unbound binder + invalid user changes: hasChanges() == true
- nameField.setValue("");
- assertTrue(binder.hasChanges());
-
- // unsuccessful writeBean doesn't affect hasChanges
- nameField.setValue("");
- binder.writeBeanIfValid(new Person());
- assertTrue(binder.hasChanges());
- }
-
- @Test(expected = ValidationException.class)
- public void save_fieldValidationErrors() throws ValidationException {
- Binder<Person> binder = new Binder<>();
- String msg = "foo";
- binder.forField(nameField).withValidator(new NotEmptyValidator<>(msg))
- .bind(Person::getFirstName, Person::setFirstName);
-
- Person person = new Person();
- String firstName = "foo";
- person.setFirstName(firstName);
- nameField.setValue("");
- try {
- binder.writeBean(person);
- } finally {
- // Bean should not have been updated
- Assert.assertEquals(firstName, person.getFirstName());
- }
- }
-
- @Test(expected = ValidationException.class)
- public void save_beanValidationErrors() throws ValidationException {
- Binder<Person> binder = new Binder<>();
- binder.forField(nameField).withValidator(new NotEmptyValidator<>("a"))
- .bind(Person::getFirstName, Person::setFirstName);
-
- binder.withValidator(Validator.from(person -> false, "b"));
-
- Person person = new Person();
- nameField.setValue("foo");
- try {
- binder.writeBean(person);
- } finally {
- // Bean should have been updated for item validation but reverted
- Assert.assertNull(person.getFirstName());
- }
- }
-
- @Test
- public void save_fieldsAndBeanLevelValidation() throws ValidationException {
- binder.forField(nameField).withValidator(new NotEmptyValidator<>("a"))
- .bind(Person::getFirstName, Person::setFirstName);
-
- binder.withValidator(
- Validator.from(person -> person.getLastName() != null, "b"));
-
- Person person = new Person();
- person.setLastName("bar");
- nameField.setValue("foo");
- binder.writeBean(person);
- Assert.assertEquals(nameField.getValue(), person.getFirstName());
- Assert.assertEquals("bar", person.getLastName());
- }
-
- @Test
- public void saveIfValid_fieldValidationErrors() {
- String msg = "foo";
- binder.forField(nameField).withValidator(new NotEmptyValidator<>(msg))
- .bind(Person::getFirstName, Person::setFirstName);
-
- Person person = new Person();
- person.setFirstName("foo");
- nameField.setValue("");
- Assert.assertFalse(binder.writeBeanIfValid(person));
- Assert.assertEquals("foo", person.getFirstName());
- }
-
- @Test
- public void saveIfValid_noValidationErrors() {
- String msg = "foo";
- binder.forField(nameField).withValidator(new NotEmptyValidator<>(msg))
- .bind(Person::getFirstName, Person::setFirstName);
-
- Person person = new Person();
- person.setFirstName("foo");
- nameField.setValue("bar");
-
- Assert.assertTrue(binder.writeBeanIfValid(person));
- Assert.assertEquals("bar", person.getFirstName());
- }
-
- @Test
- public void saveIfValid_beanValidationErrors() {
- Binder<Person> binder = new Binder<>();
- binder.forField(nameField).bind(Person::getFirstName,
- Person::setFirstName);
-
- String msg = "foo";
- binder.withValidator(Validator.from(
- prsn -> prsn.getAddress() != null || prsn.getEmail() != null,
- msg));
-
- Person person = new Person();
- person.setFirstName("foo");
- nameField.setValue("");
- Assert.assertFalse(binder.writeBeanIfValid(person));
-
- Assert.assertEquals("foo", person.getFirstName());
- }
-
- @Test
- public void save_null_beanIsUpdated() throws ValidationException {
- Binder<Person> binder = new Binder<>();
- binder.forField(nameField).withConverter(fieldValue -> {
- if ("null".equals(fieldValue)) {
- return null;
- } else {
- return fieldValue;
- }
- }, model -> {
- return model;
- }).bind(Person::getFirstName, Person::setFirstName);
-
- Person person = new Person();
- person.setFirstName("foo");
-
- nameField.setValue("null");
-
- binder.writeBean(person);
-
- Assert.assertNull(person.getFirstName());
- }
-
- @Test
- public void save_validationErrors_exceptionContainsErrors()
- throws ValidationException {
- String msg = "foo";
- BindingBuilder<Person, String> nameBinding = binder.forField(nameField)
- .withValidator(new NotEmptyValidator<>(msg));
- nameBinding.bind(Person::getFirstName, Person::setFirstName);
-
- BindingBuilder<Person, Integer> ageBinding = binder.forField(ageField)
- .withConverter(stringToInteger).withValidator(notNegative);
- ageBinding.bind(Person::getAge, Person::setAge);
-
- Person person = new Person();
- nameField.setValue("");
- ageField.setValue("-1");
- try {
- binder.writeBean(person);
- Assert.fail();
- } catch (ValidationException exception) {
- List<ValidationStatus<?>> validationErrors = exception
- .getFieldValidationErrors();
- Assert.assertEquals(2, validationErrors.size());
- ValidationStatus<?> error = validationErrors.get(0);
- Assert.assertEquals(nameField, error.getField());
- Assert.assertEquals(msg, error.getMessage().get());
-
- error = validationErrors.get(1);
- Assert.assertEquals(ageField, error.getField());
- Assert.assertEquals(NEGATIVE_ERROR_MESSAGE,
- error.getMessage().get());
- }
- }
-
- @Test
- public void binderBindAndLoad_clearsErrors() {
- BindingBuilder<Person, String> binding = binder.forField(nameField)
- .withValidator(notEmpty);
- binding.bind(Person::getFirstName, Person::setFirstName);
- binder.withValidator(bean -> !bean.getFirstName().contains("error"),
- "error");
- Person person = new Person();
- person.setFirstName("");
- binder.setBean(person);
-
- // initial value is invalid but no error
- Assert.assertNull(nameField.getComponentError());
-
- // make error show
- nameField.setValue("foo");
- nameField.setValue("");
- Assert.assertNotNull(nameField.getComponentError());
-
- // bind to another person to see that error is cleared
- person = new Person();
- person.setFirstName("");
- binder.setBean(person);
- // error has been cleared
- Assert.assertNull(nameField.getComponentError());
-
- // make show error
- nameField.setValue("foo");
- nameField.setValue("");
- Assert.assertNotNull(nameField.getComponentError());
-
- // load should also clear error
- binder.readBean(person);
- Assert.assertNull(nameField.getComponentError());
-
- // bind a new field that has invalid value in bean
- TextField lastNameField = new TextField();
- person.setLastName("");
- BindingBuilder<Person, String> binding2 = binder.forField(lastNameField)
- .withValidator(notEmpty);
- binding2.bind(Person::getLastName, Person::setLastName);
-
- // should not have error shown
- Assert.assertNull(lastNameField.getComponentError());
-
- // add status label to show bean level error
- Label statusLabel = new Label();
- binder.setStatusLabel(statusLabel);
- nameField.setValue("error");
-
- // no error shown yet because second field validation doesn't pass
- Assert.assertEquals("", statusLabel.getValue());
-
- // make second field validation pass to get bean validation error
- lastNameField.setValue("foo");
- Assert.assertEquals("error", statusLabel.getValue());
-
- // reload bean to clear error
- binder.readBean(person);
- Assert.assertEquals("", statusLabel.getValue());
-
- // reset() should clear all errors and status label
- nameField.setValue("");
- lastNameField.setValue("");
- Assert.assertNotNull(nameField.getComponentError());
- Assert.assertNotNull(lastNameField.getComponentError());
- statusLabel.setComponentError(new UserError("ERROR"));
-
- binder.removeBean();
- Assert.assertNull(nameField.getComponentError());
- Assert.assertNull(lastNameField.getComponentError());
- Assert.assertEquals("", statusLabel.getValue());
- }
-
- @Test
- public void binderLoad_withCrossFieldValidation_clearsErrors() {
- TextField lastNameField = new TextField();
- final SerializablePredicate<String> lengthPredicate = v -> v
- .length() > 2;
-
- BindingBuilder<Person, String> firstNameBinding = binder
- .forField(nameField).withValidator(lengthPredicate, "length");
- firstNameBinding.bind(Person::getFirstName, Person::setFirstName);
-
- Binding<Person, String> lastNameBinding = binder.forField(lastNameField)
- .withValidator(v -> !nameField.getValue().isEmpty()
- || lengthPredicate.test(v), "err")
- .withValidator(lengthPredicate, "length")
- .bind(Person::getLastName, Person::setLastName);
-
- // this will be triggered as a new bean is bound with binder.bind(),
- // causing a validation error to be visible until reset is done
- nameField.addValueChangeListener(v -> lastNameBinding.validate());
-
- Person person = new Person();
- binder.setBean(person);
-
- Assert.assertNull(nameField.getComponentError());
- Assert.assertNull(lastNameField.getComponentError());
-
- nameField.setValue("x");
-
- Assert.assertNotNull(nameField.getComponentError());
- Assert.assertNotNull(lastNameField.getComponentError());
-
- binder.setBean(person);
-
- Assert.assertNull(nameField.getComponentError());
- Assert.assertNull(lastNameField.getComponentError());
- }
-
- protected void bindName() {
- binder.bind(nameField, Person::getFirstName, Person::setFirstName);
- binder.setBean(item);
- }
-
- protected void bindAgeWithValidatorConverterValidator() {
- binder.forField(ageField).withValidator(notEmpty)
- .withConverter(stringToInteger).withValidator(notNegative)
- .bind(Person::getAge, Person::setAge);
- binder.setBean(item);
- }
-
- @Test(expected = ValidationException.class)
- public void save_beanValidationErrorsWithConverter()
- throws ValidationException {
- Binder<Person> binder = new Binder<>();
- binder.forField(ageField)
- .withConverter(new StringToIntegerConverter("Can't convert"))
- .bind(Person::getAge, Person::setAge);
-
- binder.withValidator(Validator.from(person -> false, "b"));
-
- Person person = new Person();
- ageField.setValue("1");
- try {
- binder.writeBean(person);
- } finally {
- // Bean should have been updated for item validation but reverted
- Assert.assertEquals(0, person.getAge());
- }
- }
- }
|