From 86bef9030fa4e026107db74cd9eef288beb1beca Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 22 Dec 2011 14:57:23 +0100 Subject: [PATCH] correctly handle ParseException from Formatter for String->String case (SPR-8944) --- .../beans/TypeConverterDelegate.java | 3 +++ .../validation/DataBinderTests.java | 25 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java b/org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java index c2cf49eac6..b34ddbb77e 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java @@ -244,6 +244,9 @@ class TypeConverterDelegate { } if (firstAttemptEx != null) { + if (editor == null) { + throw firstAttemptEx; + } logger.debug("Original ConversionService attempt failed - ignored since " + "PropertyEditor based conversion eventually succeeded", firstAttemptEx); } diff --git a/org.springframework.context/src/test/java/org/springframework/validation/DataBinderTests.java b/org.springframework.context/src/test/java/org/springframework/validation/DataBinderTests.java index 455cb8842b..ea9fd94b11 100644 --- a/org.springframework.context/src/test/java/org/springframework/validation/DataBinderTests.java +++ b/org.springframework.context/src/test/java/org/springframework/validation/DataBinderTests.java @@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.text.ParseException; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collection; @@ -51,8 +52,8 @@ import org.springframework.beans.propertyeditors.CustomNumberEditor; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.context.support.StaticMessageSource; -import org.springframework.core.convert.support.ConversionServiceFactory; import org.springframework.core.convert.support.DefaultConversionService; +import org.springframework.format.Formatter; import org.springframework.format.number.NumberFormatter; import org.springframework.format.support.FormattingConversionService; import org.springframework.util.StringUtils; @@ -374,6 +375,28 @@ public class DataBinderTests extends TestCase { } } + public void testBindingErrorWithStringFormatter() { + TestBean tb = new TestBean(); + DataBinder binder = new DataBinder(tb); + FormattingConversionService conversionService = new FormattingConversionService(); + DefaultConversionService.addDefaultConverters(conversionService); + conversionService.addFormatterForFieldType(String.class, new Formatter() { + public String parse(String text, Locale locale) throws ParseException { + throw new ParseException(text, 0); + } + public String print(String object, Locale locale) { + return object; + } + }); + binder.setConversionService(conversionService); + MutablePropertyValues pvs = new MutablePropertyValues(); + pvs.add("name", "test"); + + binder.bind(pvs); + assertTrue(binder.getBindingResult().hasFieldErrors("name")); + assertEquals("test", binder.getBindingResult().getFieldValue("name")); + } + public void testBindingWithFormatterAgainstList() { BeanWithIntegerList tb = new BeanWithIntegerList(); DataBinder binder = new DataBinder(tb);