From bafab4554a43f7c0214e919fa9d594a92305bc92 Mon Sep 17 00:00:00 2001 From: vt512 Date: Tue, 8 Sep 2020 16:29:17 +0200 Subject: fix duplicate key exception with Binder when interface method is overwritten (#12091) --- .../main/java/com/vaadin/data/BeanPropertySet.java | 2 +- .../test/java/com/vaadin/data/BeanBinderTest.java | 28 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/vaadin/data/BeanPropertySet.java b/server/src/main/java/com/vaadin/data/BeanPropertySet.java index 90c264eaa1..bd856c23f8 100644 --- a/server/src/main/java/com/vaadin/data/BeanPropertySet.java +++ b/server/src/main/java/com/vaadin/data/BeanPropertySet.java @@ -313,7 +313,7 @@ public class BeanPropertySet implements PropertySet { .map(descriptor -> new BeanPropertyDefinition<>(this, instanceKey.type, descriptor)) .collect(Collectors.toMap(PropertyDefinition::getName, - Function.identity())); + Function.identity(), (pd1, pd2) -> pd2)); } catch (IntrospectionException e) { throw new IllegalArgumentException( "Cannot find property descriptors for " diff --git a/server/src/test/java/com/vaadin/data/BeanBinderTest.java b/server/src/test/java/com/vaadin/data/BeanBinderTest.java index bdcfb16d7b..2b29303c78 100644 --- a/server/src/test/java/com/vaadin/data/BeanBinderTest.java +++ b/server/src/test/java/com/vaadin/data/BeanBinderTest.java @@ -21,6 +21,7 @@ import org.junit.Test; import com.vaadin.data.BeanBinderTest.RequiredConstraints.SubConstraint; import com.vaadin.data.BeanBinderTest.RequiredConstraints.SubSubConstraint; +import com.vaadin.data.BinderInstanceFieldTest.IntegerTextField; import com.vaadin.data.converter.StringToIntegerConverter; import com.vaadin.tests.data.bean.BeanToValidate; import com.vaadin.ui.CheckBoxGroup; @@ -167,6 +168,15 @@ public class BeanBinderTest private TextField mydate = new TextField(); } + public interface TestInterface { + int getProperty(); + } + + public interface TestInterfaceWithOverwrittenMethod extends TestInterface { + @Override + int getProperty(); + } + @Before public void setUp() { binder = new BeanValidationBinder<>(BeanToValidate.class); @@ -537,6 +547,24 @@ public class BeanBinderTest assertTrue(binder.validate().isOk()); } + @Test + public void interface_extension_with_overwritten_property() { + Binder binder = new Binder<>( + TestInterfaceWithOverwrittenMethod.class); + IntegerTextField field = new IntegerTextField(); + + binder.bind(field, "property"); + TestInterfaceWithOverwrittenMethod bean = new TestInterfaceWithOverwrittenMethod() { + @Override + public int getProperty() { + return 5; + } + }; + binder.setBean(bean); + + assertEquals(Integer.valueOf(5), field.getValue()); + } + private void assertInvalid(HasValue field, String message) { BinderValidationStatus status = binder.validate(); List> errors = status -- cgit v1.2.3