From f786fc32263ff6260b347076212c06d320412273 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 5 Mar 2015 18:53:03 +0100 Subject: [PATCH] ObjectToOptionalConverter preserves existing Optional instances Issue: SPR-12785 --- .../support/ObjectToOptionalConverter.java | 8 ++- .../support/DefaultConversionTests.java | 67 ++++++++++--------- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/ObjectToOptionalConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/ObjectToOptionalConverter.java index 824a691b56..8c70120110 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/ObjectToOptionalConverter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/ObjectToOptionalConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ import org.springframework.lang.UsesJava8; * of Optional when known. * * @author Rossen Stoyanchev + * @author Juergen Hoeller * @since 4.1 */ @UsesJava8 @@ -64,7 +65,10 @@ final class ObjectToOptionalConverter implements ConditionalGenericConverter { if (source == null) { return Optional.empty(); } - if (targetType.getResolvableType() == null) { + else if (source instanceof Optional) { + return source; + } + else if (targetType.getResolvableType() == null) { return Optional.of(source); } else { diff --git a/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java b/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java index 43b94f324e..9cec877ccc 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,7 +71,7 @@ public class DefaultConversionTests { assertEquals(null, conversionService.convert("", Character.class)); } - @Test(expected=ConversionFailedException.class) + @Test(expected = ConversionFailedException.class) public void testStringToCharacterInvalidString() { conversionService.convert("invalid", Character.class); } @@ -108,7 +108,7 @@ public class DefaultConversionTests { assertEquals(null, conversionService.convert("", Boolean.class)); } - @Test(expected=ConversionFailedException.class) + @Test(expected = ConversionFailedException.class) public void testStringToBooleanInvalidString() { conversionService.convert("invalid", Boolean.class); } @@ -267,36 +267,11 @@ public class DefaultConversionTests { assertEquals(Long.valueOf(1), conversionService.convert(1, Long.class)); } - @Test(expected=ConversionFailedException.class) + @Test(expected = ConversionFailedException.class) public void testNumberToNumberNotSupportedNumber() { conversionService.convert(1, CustomNumber.class); } - @SuppressWarnings("serial") - public static class CustomNumber extends Number { - - @Override - public double doubleValue() { - return 0; - } - - @Override - public float floatValue() { - return 0; - } - - @Override - public int intValue() { - return 0; - } - - @Override - public long longValue() { - return 0; - } - - } - @Test public void testNumberToCharacter() { assertEquals(Character.valueOf('A'), conversionService.convert(65, Character.class)); @@ -827,7 +802,7 @@ public class DefaultConversionTests { TypeDescriptor descriptor = new TypeDescriptor(parameter); Object actual = conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class), descriptor); assertEquals(Optional.class, actual.getClass()); - assertEquals(Arrays.asList(1,2,3), ((Optional>) actual).get()); + assertEquals(Arrays.asList(1, 2, 3), ((Optional>) actual).get()); } @Test @@ -837,6 +812,38 @@ public class DefaultConversionTests { assertSame(Optional.empty(), conversionService.convert(null, Optional.class)); } + @Test + public void convertExistingOptional() { + assertSame(Optional.empty(), conversionService.convert(Optional.empty(), TypeDescriptor.valueOf(Object.class), + TypeDescriptor.valueOf(Optional.class))); + assertSame(Optional.empty(), conversionService.convert(Optional.empty(), Optional.class)); + } + + + @SuppressWarnings("serial") + public static class CustomNumber extends Number { + + @Override + public double doubleValue() { + return 0; + } + + @Override + public float floatValue() { + return 0; + } + + @Override + public int intValue() { + return 0; + } + + @Override + public long longValue() { + return 0; + } + } + public static class TestEntity {