From ace15afeee564a4266e18fc54fa22b359af496fb Mon Sep 17 00:00:00 2001 From: Naveed Khan Date: Sun, 19 Jul 2026 23:05:41 +0000 Subject: [PATCH] fix ClassCastException in DoubleLocaleConverter when input is non-Double Number --- .../locale/converters/DoubleLocaleConverter.java | 6 +++--- .../converters/DoubleLocaleConverterTest.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/DoubleLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/DoubleLocaleConverter.java index c0ec09946..bec578005 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/converters/DoubleLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/DoubleLocaleConverter.java @@ -71,9 +71,9 @@ private DoubleLocaleConverter(final Double defaultValue, final Locale locale, fi @Override protected Double parse(final Object value, final String pattern) throws ParseException { final Number result = super.parse(value, pattern); - if (result instanceof Long) { - return Double.valueOf(result.doubleValue()); + if (result == null || result instanceof Double) { + return (Double) result; } - return (Double) result; + return Double.valueOf(result.doubleValue()); } } diff --git a/src/test/java/org/apache/commons/beanutils2/converters/DoubleLocaleConverterTest.java b/src/test/java/org/apache/commons/beanutils2/converters/DoubleLocaleConverterTest.java index 0fd961e2b..4e8daf1d3 100644 --- a/src/test/java/org/apache/commons/beanutils2/converters/DoubleLocaleConverterTest.java +++ b/src/test/java/org/apache/commons/beanutils2/converters/DoubleLocaleConverterTest.java @@ -17,6 +17,8 @@ package org.apache.commons.beanutils2.converters; +import static org.junit.jupiter.api.Assertions.assertEquals; + import org.apache.commons.beanutils2.locale.converters.DoubleLocaleConverter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -37,6 +39,17 @@ public void setUp() throws Exception { expectedValue = Double.valueOf(expectedDecimalValue); } + /** + * Passing a non-Double Number directly (e.g. Integer) must return a Double, not throw ClassCastException. + */ + @Test + void testConvertFromNonDoubleNumber() { + final DoubleLocaleConverter c = DoubleLocaleConverter.builder().get(); + assertEquals(Double.valueOf(42.0), c.convert(Double.class, Integer.valueOf(42), null)); + assertEquals(Double.valueOf(3.14f), c.convert(Double.class, Float.valueOf(3.14f), null)); + assertEquals(Double.valueOf(100L), c.convert(Double.class, Long.valueOf(100L), null)); + } + /** * Test Converter() constructor Uses the default locale, no default value */