diff options
author | Teemu Suo-Anttila <tsuoanttila@users.noreply.github.com> | 2017-05-26 10:14:10 +0300 |
---|---|---|
committer | Ilia Motornyi <elmot@vaadin.com> | 2017-05-26 10:14:10 +0300 |
commit | 870ac3dd370adf9634ee5e4d054647886e0c268a (patch) | |
tree | 0d539d706265b372e93b674b6ff8ee7195e838c0 | |
parent | be058cbf57ee75c29b84657962b3442c4b3243c1 (diff) | |
download | vaadin-framework-870ac3dd370adf9634ee5e4d054647886e0c268a.tar.gz vaadin-framework-870ac3dd370adf9634ee5e4d054647886e0c268a.zip |
Throw exception if user modifies same binding step twice
Fixes #9427
-rw-r--r-- | server/src/main/java/com/vaadin/data/Binder.java | 3 | ||||
-rw-r--r-- | server/src/test/java/com/vaadin/data/BinderTest.java | 12 |
2 files changed, 15 insertions, 0 deletions
diff --git a/server/src/main/java/com/vaadin/data/Binder.java b/server/src/main/java/com/vaadin/data/Binder.java index e734baa98a..98a9c65b2b 100644 --- a/server/src/main/java/com/vaadin/data/Binder.java +++ b/server/src/main/java/com/vaadin/data/Binder.java @@ -711,6 +711,9 @@ public class Binder<BEAN> implements Serializable { checkUnbound(); Objects.requireNonNull(converter, "converter cannot be null"); + // Mark this step to be bound to prevent modifying multiple times. + bound = true; + if (resetNullRepresentation) { getBinder().initialConverters.get(field).setIdentity(); } diff --git a/server/src/test/java/com/vaadin/data/BinderTest.java b/server/src/test/java/com/vaadin/data/BinderTest.java index a521449c04..2a90eb6c4b 100644 --- a/server/src/test/java/com/vaadin/data/BinderTest.java +++ b/server/src/test/java/com/vaadin/data/BinderTest.java @@ -17,6 +17,7 @@ import org.junit.Before; import org.junit.Test; import com.vaadin.data.Binder.BindingBuilder; +import com.vaadin.data.converter.StringToDoubleConverter; import com.vaadin.data.converter.StringToIntegerConverter; import com.vaadin.data.validator.NotEmptyValidator; import com.vaadin.server.ErrorMessage; @@ -670,4 +671,15 @@ public class BinderTest extends BinderTestBase<Binder<Person>, Person> { private void assertStreamEquals(Stream<?> s1, Stream<?> s2) { Assert.assertArrayEquals(s1.toArray(), s2.toArray()); } + + /** + * Access to old step in binding chain that already has a converter applied + * to it is expected to prevent modifications. + */ + @Test(expected = IllegalStateException.class) + public void multiple_calls_to_same_binder_throws() { + BindingBuilder<Person, String> forField = binder.forField(nameField); + forField.withConverter(new StringToDoubleConverter("Failed")); + forField.bind(Person::getFirstName, Person::setFirstName); + } } |