Skip to content

Commit f269190

Browse files
committed
ObjectToOptionalConverter preserves existing Optional instances
Issue: SPR-12785 (cherry picked from commit f786fc3)
1 parent 5f30575 commit f269190

File tree

2 files changed

+43
-32
lines changed

2 files changed

+43
-32
lines changed

spring-core/src/main/java/org/springframework/core/convert/support/ObjectToOptionalConverter.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
3131
* of Optional when known.
3232
*
3333
* @author Rossen Stoyanchev
34+
* @author Juergen Hoeller
3435
* @since 4.1
3536
*/
3637
@UsesJava8
@@ -64,7 +65,10 @@ public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor t
6465
if (source == null) {
6566
return Optional.empty();
6667
}
67-
if (targetType.getResolvableType() == null) {
68+
else if (source instanceof Optional) {
69+
return source;
70+
}
71+
else if (targetType.getResolvableType() == null) {
6872
return Optional.of(source);
6973
}
7074
else {

spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java

+37-30
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -69,7 +69,7 @@ public void testStringToCharacterEmptyString() {
6969
assertEquals(null, conversionService.convert("", Character.class));
7070
}
7171

72-
@Test(expected=ConversionFailedException.class)
72+
@Test(expected = ConversionFailedException.class)
7373
public void testStringToCharacterInvalidString() {
7474
conversionService.convert("invalid", Character.class);
7575
}
@@ -106,7 +106,7 @@ public void testStringToBooleanEmptyString() {
106106
assertEquals(null, conversionService.convert("", Boolean.class));
107107
}
108108

109-
@Test(expected=ConversionFailedException.class)
109+
@Test(expected = ConversionFailedException.class)
110110
public void testStringToBooleanInvalidString() {
111111
conversionService.convert("invalid", Boolean.class);
112112
}
@@ -265,36 +265,11 @@ public void testNumberToNumber() {
265265
assertEquals(Long.valueOf(1), conversionService.convert(Integer.valueOf(1), Long.class));
266266
}
267267

268-
@Test(expected=ConversionFailedException.class)
268+
@Test(expected = ConversionFailedException.class)
269269
public void testNumberToNumberNotSupportedNumber() {
270270
conversionService.convert(Integer.valueOf(1), CustomNumber.class);
271271
}
272272

273-
@SuppressWarnings("serial")
274-
public static class CustomNumber extends Number {
275-
276-
@Override
277-
public double doubleValue() {
278-
return 0;
279-
}
280-
281-
@Override
282-
public float floatValue() {
283-
return 0;
284-
}
285-
286-
@Override
287-
public int intValue() {
288-
return 0;
289-
}
290-
291-
@Override
292-
public long longValue() {
293-
return 0;
294-
}
295-
296-
}
297-
298273
@Test
299274
public void testNumberToCharacter() {
300275
assertEquals(Character.valueOf('A'), conversionService.convert(Integer.valueOf(65), Character.class));
@@ -798,7 +773,7 @@ public void convertObjectToOptional() {
798773
TypeDescriptor descriptor = new TypeDescriptor(parameter);
799774
Object actual = conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class), descriptor);
800775
assertEquals(Optional.class, actual.getClass());
801-
assertEquals(Arrays.asList(1,2,3), ((Optional<List<Integer>>) actual).get());
776+
assertEquals(Arrays.asList(1, 2, 3), ((Optional<List<Integer>>) actual).get());
802777
}
803778

804779
@Test
@@ -807,6 +782,38 @@ public void convertObjectToOptionalNull() {
807782
assertSame(Optional.empty(), conversionService.convert(null, Optional.class));
808783
}
809784

785+
@Test
786+
public void convertExistingOptional() {
787+
assertSame(Optional.empty(), conversionService.convert(Optional.empty(), TypeDescriptor.valueOf(Object.class),
788+
TypeDescriptor.valueOf(Optional.class)));
789+
assertSame(Optional.empty(), conversionService.convert(Optional.empty(), Optional.class));
790+
}
791+
792+
793+
@SuppressWarnings("serial")
794+
public static class CustomNumber extends Number {
795+
796+
@Override
797+
public double doubleValue() {
798+
return 0;
799+
}
800+
801+
@Override
802+
public float floatValue() {
803+
return 0;
804+
}
805+
806+
@Override
807+
public int intValue() {
808+
return 0;
809+
}
810+
811+
@Override
812+
public long longValue() {
813+
return 0;
814+
}
815+
}
816+
810817

811818
public static class TestEntity {
812819

0 commit comments

Comments
 (0)