diff --git a/src/main/java/org/apache/commons/beanutils2/locale/converters/LongLocaleConverter.java b/src/main/java/org/apache/commons/beanutils2/locale/converters/LongLocaleConverter.java index 918222e5d..855a5affd 100644 --- a/src/main/java/org/apache/commons/beanutils2/locale/converters/LongLocaleConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/locale/converters/LongLocaleConverter.java @@ -78,6 +78,11 @@ protected Long parse(final Object value, final String pattern) throws ParseExcep return (Long) result; } + final double doubleValue = result.doubleValue(); + if (doubleValue < Long.MIN_VALUE || doubleValue > Long.MAX_VALUE) { + throw new ConversionException("Supplied number is not of type Long: " + result); + } + return Long.valueOf(result.longValue()); } } diff --git a/src/test/java/org/apache/commons/beanutils2/converters/LongLocaleConverterTest.java b/src/test/java/org/apache/commons/beanutils2/converters/LongLocaleConverterTest.java index f1c4f5e22..dac385f3e 100644 --- a/src/test/java/org/apache/commons/beanutils2/converters/LongLocaleConverterTest.java +++ b/src/test/java/org/apache/commons/beanutils2/converters/LongLocaleConverterTest.java @@ -17,6 +17,12 @@ package org.apache.commons.beanutils2.converters; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.text.DecimalFormat; + +import org.apache.commons.beanutils2.ConversionException; import org.apache.commons.beanutils2.locale.converters.LongLocaleConverter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -189,4 +195,17 @@ void testConstructorMain() { convertInvalid(converter, "(C)", defaultValue); convertNull(converter, "(C)", defaultValue); } + + /** + * Test Long limits + */ + @Test + void testLongLimits() { + converter = LongLocaleConverter.builder().setLocale(defaultLocale).get(); + final DecimalFormat fmt = new DecimalFormat("#"); + assertEquals(Long.valueOf(Long.MAX_VALUE), converter.convert(fmt.format(Long.MAX_VALUE)), "Long.MAX_VALUE"); + assertEquals(Long.valueOf(Long.MIN_VALUE), converter.convert(fmt.format(Long.MIN_VALUE)), "Long.MIN_VALUE"); + assertThrows(ConversionException.class, () -> converter.convert("99999999999999999999")); + assertThrows(ConversionException.class, () -> converter.convert("-99999999999999999999")); + } }