summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeemu Suo-Anttila <tsuoanttila@users.noreply.github.com>2017-05-26 10:14:10 +0300
committerIlia Motornyi <elmot@vaadin.com>2017-05-26 10:14:10 +0300
commit870ac3dd370adf9634ee5e4d054647886e0c268a (patch)
tree0d539d706265b372e93b674b6ff8ee7195e838c0
parentbe058cbf57ee75c29b84657962b3442c4b3243c1 (diff)
downloadvaadin-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.java3
-rw-r--r--server/src/test/java/com/vaadin/data/BinderTest.java12
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);
+ }
}