From 53d266e1abf073cef73980fe7f6954600e7419d2 Mon Sep 17 00:00:00 2001 From: Anna Koskinen Date: Fri, 29 Oct 2021 14:30:37 +0300 Subject: [PATCH] fix: Ensure that side effects of readBean does not set hasChanges true (#12462) (#12455) Authored-by: Tatu Lund --- .../src/main/java/com/vaadin/data/Binder.java | 2 +- .../test/java/com/vaadin/data/BinderTest.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/vaadin/data/Binder.java b/server/src/main/java/com/vaadin/data/Binder.java index 110e260b0c..e969a032f7 100644 --- a/server/src/main/java/com/vaadin/data/Binder.java +++ b/server/src/main/java/com/vaadin/data/Binder.java @@ -1891,7 +1891,6 @@ public class Binder implements Serializable { if (bean == null) { clearFields(); } else { - changedBindings.clear(); getBindings().forEach(binding -> { // Some bindings may have been removed from binder // during readBean. We should skip those bindings to @@ -1902,6 +1901,7 @@ public class Binder implements Serializable { binding.initFieldValue(bean, false); } }); + changedBindings.clear(); getValidationStatusHandler().statusChange( BinderValidationStatus.createUnresolvedStatus(this)); fireStatusChangeEvent(false); diff --git a/server/src/test/java/com/vaadin/data/BinderTest.java b/server/src/test/java/com/vaadin/data/BinderTest.java index fe529fa8f5..62ac93ce8e 100644 --- a/server/src/test/java/com/vaadin/data/BinderTest.java +++ b/server/src/test/java/com/vaadin/data/BinderTest.java @@ -1518,6 +1518,28 @@ public class BinderTest extends BinderTestBase, Person> { assertEquals(new Double(2000), item.getSalaryDouble()); } + // See: https://github.com/vaadin/framework/issues/9581 + @Test + public void withConverter_hasChangesFalse() { + TextField nameField = new TextField(); + nameField.setValue(""); + TextField rentField = new TextField(); + rentField.setValue(""); + rentField.addValueChangeListener(event -> { + nameField.setValue("Name"); + }); + item.setRent(BigDecimal.valueOf(10)); + binder.forField(nameField).bind(Person::getFirstName, Person::setFirstName); + binder.forField(rentField).withConverter(new EuroConverter("")) + .withNullRepresentation(BigDecimal.valueOf(0d)) + .bind(Person::getRent, Person::setRent); + binder.readBean(item); + + assertFalse(binder.hasChanges()); + assertEquals("€ 10.00", rentField.getValue()); + assertEquals("Name", nameField.getValue()); + } + private TextField createNullAnd42RejectingFieldWithEmptyValue( String emptyValue) { return new TextField() { -- 2.39.5