aboutsummaryrefslogtreecommitdiffstats
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/main/java/com/vaadin/data/Binder.java43
-rw-r--r--server/src/test/java/com/vaadin/data/BinderTest.java15
2 files changed, 55 insertions, 3 deletions
diff --git a/server/src/main/java/com/vaadin/data/Binder.java b/server/src/main/java/com/vaadin/data/Binder.java
index 8a11cc36ee..1fb64c837f 100644
--- a/server/src/main/java/com/vaadin/data/Binder.java
+++ b/server/src/main/java/com/vaadin/data/Binder.java
@@ -273,6 +273,28 @@ public class Binder<BEAN> implements Serializable {
* @since 8.11
*/
public boolean isValidatorsDisabled();
+
+ /**
+ * Define whether the value should be converted back to the presentation
+ * in the field when a converter is used in binding.
+ *
+ * @param convertBackToPresentation
+ * A boolean value
+ *
+ * @since 8.13
+ */
+ public void setConvertBackToPresentation(
+ boolean convertBackToPresentation);
+
+ /**
+ * Returns whether the value is converted back to the presentation in
+ * the field when a converter is used in binding.
+ *
+ * @return A boolean value
+ *
+ * @since 8.13
+ */
+ public boolean isConvertBackToPresentation();
}
/**
@@ -1092,6 +1114,8 @@ public class Binder<BEAN> implements Serializable {
private boolean validatorsDisabled = false;
+ private boolean convertBackToPresentation = true;
+
public BindingImpl(BindingBuilderImpl<BEAN, FIELDVALUE, TARGET> builder,
ValueProvider<BEAN, TARGET> getter,
Setter<BEAN, TARGET> setter) {
@@ -1272,10 +1296,12 @@ public class Binder<BEAN> implements Serializable {
/**
* Write the field value by invoking the setter function on the given
- * bean, if the value passes all registered validators.
+ * bean, if the value passes all registered validators. Write value back
+ * to the field as well if {@code isConvertBackToPresentation()} is
+ * true.
*
* @param bean
- * the bean to set the property value to
+ * the bean to set the property value to, not null
*/
private BindingValidationStatus<TARGET> writeFieldValue(BEAN bean) {
assert bean != null;
@@ -1284,7 +1310,7 @@ public class Binder<BEAN> implements Serializable {
if (!isReadOnly()) {
result.ifOk(value -> {
setter.accept(bean, value);
- if (value != null) {
+ if (convertBackToPresentation && value != null) {
FIELDVALUE converted = convertToFieldType(value);
if (!Objects.equals(field.getValue(), converted)) {
getField().setValue(converted);
@@ -1392,6 +1418,17 @@ public class Binder<BEAN> implements Serializable {
public boolean isValidatorsDisabled() {
return validatorsDisabled;
}
+
+ @Override
+ public void setConvertBackToPresentation(
+ boolean convertBackToPresentation) {
+ this.convertBackToPresentation = convertBackToPresentation;
+ }
+
+ @Override
+ public boolean isConvertBackToPresentation() {
+ return convertBackToPresentation;
+ }
}
/**
diff --git a/server/src/test/java/com/vaadin/data/BinderTest.java b/server/src/test/java/com/vaadin/data/BinderTest.java
index 0332572203..98f72e1197 100644
--- a/server/src/test/java/com/vaadin/data/BinderTest.java
+++ b/server/src/test/java/com/vaadin/data/BinderTest.java
@@ -518,6 +518,21 @@ public class BinderTest extends BinderTestBase<Binder<Person>, Person> {
}
@Test
+ public void withConverter_writeBackValueDisabled() {
+ TextField rentField = new TextField();
+ rentField.setValue("");
+ Binding<Person, BigDecimal> binding = binder.forField(rentField)
+ .withConverter(new EuroConverter(""))
+ .withNullRepresentation(BigDecimal.valueOf(0d))
+ .bind(Person::getRent, Person::setRent);
+ binder.setBean(item);
+ binding.setConvertBackToPresentation(false);
+ rentField.setValue("10");
+
+ assertNotEquals("€ 10.00", rentField.getValue());
+ }
+
+ @Test
public void beanBinder_nullRepresentationIsNotDisabled() {
Binder<Person> binder = new Binder<>(Person.class);
binder.forField(nameField).bind("firstName");