diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java b/spring-core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java index 3475f76e96099ad34d76c03517b7486d6c957229..27a92c5af75e39dc900690eb6460050b4faa401a 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -20,6 +20,7 @@ import org.springframework.core.convert.ConversionFailedException; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.GenericConverter; +import org.springframework.util.ClassUtils; /** * Internal utilities for the conversion package. @@ -59,7 +60,7 @@ abstract class ConversionUtils { // yes return true; } - if (sourceElementType.getType().isAssignableFrom(targetElementType.getType())) { + if (ClassUtils.isAssignable(sourceElementType.getType(), targetElementType.getType())) { // maybe return true; } diff --git a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java index 19880892917559657aff1892f68ea61091d6fcde..46ee27c1a6a5ca5dcc035f00e8c5703f5a54427e 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2019 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. @@ -133,7 +133,7 @@ public class DefaultConversionServiceTests { } @Test - public void testStringToByte() throws Exception { + public void testStringToByte() { assertEquals(Byte.valueOf("1"), conversionService.convert("1", Byte.class)); } @@ -155,7 +155,7 @@ public class DefaultConversionServiceTests { @Test public void testStringToInteger() { - assertEquals(Integer.valueOf("1"), conversionService.convert("1", Integer.class)); + assertEquals(Integer.valueOf(1), conversionService.convert("1", Integer.class)); } @Test @@ -165,7 +165,7 @@ public class DefaultConversionServiceTests { @Test public void testStringToLong() { - assertEquals(Long.valueOf("1"), conversionService.convert("1", Long.class)); + assertEquals(Long.valueOf(1), conversionService.convert("1", Long.class)); } @Test @@ -180,7 +180,7 @@ public class DefaultConversionServiceTests { @Test public void testFloatToString() { - assertEquals("1.0", conversionService.convert(new Float("1.0"), String.class)); + assertEquals("1.0", conversionService.convert(Float.valueOf("1.0"), String.class)); } @Test @@ -190,7 +190,7 @@ public class DefaultConversionServiceTests { @Test public void testDoubleToString() { - assertEquals("1.0", conversionService.convert(new Double("1.0"), String.class)); + assertEquals("1.0", conversionService.convert(Double.valueOf("1.0"), String.class)); } @Test @@ -224,12 +224,12 @@ public class DefaultConversionServiceTests { } @Test - public void testStringToEnum() throws Exception { + public void testStringToEnum() { assertEquals(Foo.BAR, conversionService.convert("BAR", Foo.class)); } @Test - public void testStringToEnumWithSubclass() throws Exception { + public void testStringToEnumWithSubclass() { assertEquals(SubFoo.BAZ, conversionService.convert("BAZ", SubFoo.BAR.getClass())); } @@ -244,12 +244,12 @@ public class DefaultConversionServiceTests { } @Test - public void testIntegerToEnum() throws Exception { + public void testIntegerToEnum() { assertEquals(Foo.BAR, conversionService.convert(0, Foo.class)); } @Test - public void testIntegerToEnumWithSubclass() throws Exception { + public void testIntegerToEnumWithSubclass() { assertEquals(SubFoo.BAZ, conversionService.convert(1, SubFoo.BAR.getClass())); } @@ -325,7 +325,7 @@ public class DefaultConversionServiceTests { @Test public void testCharacterToNumber() { - assertEquals(new Integer(65), conversionService.convert('A', Integer.class)); + assertEquals(Integer.valueOf(65), conversionService.convert('A', Integer.class)); } // collection conversion @@ -343,9 +343,9 @@ public class DefaultConversionServiceTests { @SuppressWarnings("unchecked") List result = (List) conversionService.convert(new String[] {"1", "2", "3"}, TypeDescriptor .valueOf(String[].class), new TypeDescriptor(getClass().getDeclaredField("genericList"))); - assertEquals(new Integer("1"), result.get(0)); - assertEquals(new Integer("2"), result.get(1)); - assertEquals(new Integer("3"), result.get(2)); + assertEquals(Integer.valueOf(1), result.get(0)); + assertEquals(Integer.valueOf(2), result.get(1)); + assertEquals(Integer.valueOf(3), result.get(2)); } @Test @@ -384,10 +384,6 @@ public class DefaultConversionServiceTests { conversionService.convert(new String[]{"1", "2", "3"}, AbstractList.class); } - public static enum FooEnum { - BAR, BAZ - } - @Test public void convertArrayToString() { String result = conversionService.convert(new String[] {"1", "2", "3"}, String.class); @@ -419,9 +415,9 @@ public class DefaultConversionServiceTests { public void convertStringToArrayWithElementConversion() { Integer[] result = conversionService.convert("1,2,3", Integer[].class); assertEquals(3, result.length); - assertEquals(new Integer(1), result[0]); - assertEquals(new Integer(2), result[1]); - assertEquals(new Integer(3), result[2]); + assertEquals(Integer.valueOf(1), result[0]); + assertEquals(Integer.valueOf(2), result[1]); + assertEquals(Integer.valueOf(3), result[2]); } @Test @@ -450,7 +446,7 @@ public class DefaultConversionServiceTests { public void convertArrayToObjectWithElementConversion() { String[] array = new String[] {"3"}; Integer result = conversionService.convert(array, Integer.class); - assertEquals(new Integer(3), result); + assertEquals(Integer.valueOf(3), result); } @Test @@ -471,12 +467,12 @@ public class DefaultConversionServiceTests { public void convertObjectToArrayWithElementConversion() { Integer[] result = conversionService.convert(3L, Integer[].class); assertEquals(1, result.length); - assertEquals(new Integer(3), result[0]); + assertEquals(Integer.valueOf(3), result[0]); } @Test public void convertCollectionToArray() { - List list = new ArrayList(); + List list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); @@ -488,14 +484,14 @@ public class DefaultConversionServiceTests { @Test public void convertCollectionToArrayWithElementConversion() { - List list = new ArrayList(); + List list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); Integer[] result = conversionService.convert(list, Integer[].class); - assertEquals(new Integer(1), result[0]); - assertEquals(new Integer(2), result[1]); - assertEquals(new Integer(3), result[2]); + assertEquals(Integer.valueOf(1), result[0]); + assertEquals(Integer.valueOf(2), result[1]); + assertEquals(Integer.valueOf(3), result[2]); } @Test @@ -514,9 +510,8 @@ public class DefaultConversionServiceTests { } @Test - @SuppressWarnings("rawtypes") public void convertStringToCollection() { - List result = conversionService.convert("1,2,3", List.class); + List result = conversionService.convert("1,2,3", List.class); assertEquals(3, result.size()); assertEquals("1", result.get(0)); assertEquals("2", result.get(1)); @@ -524,9 +519,8 @@ public class DefaultConversionServiceTests { } @Test - @SuppressWarnings("rawtypes") public void convertStringToCollectionWithElementConversion() throws Exception { - List result = (List) conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class), + List result = (List) conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class), new TypeDescriptor(getClass().getField("genericList"))); assertEquals(3, result.size()); assertEquals(1, result.get(0)); @@ -535,9 +529,8 @@ public class DefaultConversionServiceTests { } @Test - @SuppressWarnings("rawtypes") public void convertEmptyStringToCollection() { - Collection result = conversionService.convert("", Collection.class); + Collection result = conversionService.convert("", Collection.class); assertEquals(0, result.size()); } @@ -545,44 +538,37 @@ public class DefaultConversionServiceTests { public void convertCollectionToObject() { List list = Collections.singletonList(3L); Long result = conversionService.convert(list, Long.class); - assertEquals(new Long(3), result); + assertEquals(Long.valueOf(3), result); } @Test public void convertCollectionToObjectWithElementConversion() { List list = Collections.singletonList("3"); Integer result = conversionService.convert(list, Integer.class); - assertEquals(new Integer(3), result); + assertEquals(Integer.valueOf(3), result); } @Test public void convertCollectionToObjectAssignableTarget() throws Exception { - Collection source = new ArrayList(); + Collection source = new ArrayList<>(); source.add("foo"); Object result = conversionService.convert(source, new TypeDescriptor(getClass().getField("assignableTarget"))); assertEquals(source, result); } @Test - @SuppressWarnings("rawtypes") - public void convertCollectionToObjectWithCustomConverter() throws Exception { - List source = new ArrayList(); + public void convertCollectionToObjectWithCustomConverter() { + List source = new ArrayList<>(); source.add("A"); source.add("B"); - conversionService.addConverter(new Converter() { - @Override - public ListWrapper convert(List source) { - return new ListWrapper(source); - } - }); + conversionService.addConverter(List.class, ListWrapper.class, ListWrapper::new); ListWrapper result = conversionService.convert(source, ListWrapper.class); assertSame(source, result.getList()); } @Test - @SuppressWarnings("rawtypes") public void convertObjectToCollection() { - List result = conversionService.convert(3L, List.class); + List result = conversionService.convert(3L, List.class); assertEquals(1, result.size()); assertEquals(3L, result.get(0)); } @@ -593,19 +579,19 @@ public class DefaultConversionServiceTests { List result = (List) conversionService.convert(3L, TypeDescriptor.valueOf(Long.class), new TypeDescriptor(getClass().getField("genericList"))); assertEquals(1, result.size()); - assertEquals(new Integer(3), result.get(0)); + assertEquals(Integer.valueOf(3), result.get(0)); } @Test - public void convertArrayToArray() { + public void convertStringArrayToIntegerArray() { Integer[] result = conversionService.convert(new String[] {"1", "2", "3"}, Integer[].class); - assertEquals(new Integer(1), result[0]); - assertEquals(new Integer(2), result[1]); - assertEquals(new Integer(3), result[2]); + assertEquals(Integer.valueOf(1), result[0]); + assertEquals(Integer.valueOf(2), result[1]); + assertEquals(Integer.valueOf(3), result[2]); } @Test - public void convertArrayToPrimitiveArray() { + public void convertStringArrayToIntArray() { int[] result = conversionService.convert(new String[] {"1", "2", "3"}, int[].class); assertEquals(1, result[0]); assertEquals(2, result[1]); @@ -613,7 +599,39 @@ public class DefaultConversionServiceTests { } @Test - public void convertArrayToWrapperArray() { + public void convertIntegerArrayToIntegerArray() { + Integer[] result = conversionService.convert(new Integer[] {1, 2, 3}, Integer[].class); + assertEquals(Integer.valueOf(1), result[0]); + assertEquals(Integer.valueOf(2), result[1]); + assertEquals(Integer.valueOf(3), result[2]); + } + + @Test + public void convertIntegerArrayToIntArray() { + int[] result = conversionService.convert(new Integer[] {1, 2, 3}, int[].class); + assertEquals(1, result[0]); + assertEquals(2, result[1]); + assertEquals(3, result[2]); + } + + @Test + public void convertObjectArrayToIntegerArray() { + Integer[] result = conversionService.convert(new Object[] {1, 2, 3}, Integer[].class); + assertEquals(Integer.valueOf(1), result[0]); + assertEquals(Integer.valueOf(2), result[1]); + assertEquals(Integer.valueOf(3), result[2]); + } + + @Test + public void convertObjectArrayToIntArray() { + int[] result = conversionService.convert(new Object[] {1, 2, 3}, int[].class); + assertEquals(1, result[0]); + assertEquals(2, result[1]); + assertEquals(3, result[2]); + } + + @Test + public void convertByteArrayToWrapperArray() { byte[] byteArray = new byte[] {1, 2, 3}; Byte[] converted = conversionService.convert(byteArray, Byte[].class); assertThat(converted, equalTo(new Byte[]{1, 2, 3})); @@ -661,16 +679,16 @@ public class DefaultConversionServiceTests { @Test public void convertCollectionToCollection() throws Exception { - Set foo = new LinkedHashSet(); + Set foo = new LinkedHashSet<>(); foo.add("1"); foo.add("2"); foo.add("3"); @SuppressWarnings("unchecked") List bar = (List) conversionService.convert(foo, TypeDescriptor.forObject(foo), new TypeDescriptor(getClass().getField("genericList"))); - assertEquals(new Integer(1), bar.get(0)); - assertEquals(new Integer(2), bar.get(1)); - assertEquals(new Integer(3), bar.get(2)); + assertEquals(Integer.valueOf(1), bar.get(0)); + assertEquals(Integer.valueOf(2), bar.get(1)); + assertEquals(Integer.valueOf(3), bar.get(2)); } @Test @@ -683,8 +701,8 @@ public class DefaultConversionServiceTests { @Test @SuppressWarnings("rawtypes") - public void convertCollectionToCollectionNotGeneric() throws Exception { - Set foo = new LinkedHashSet(); + public void convertCollectionToCollectionNotGeneric() { + Set foo = new LinkedHashSet<>(); foo.add("1"); foo.add("2"); foo.add("3"); @@ -706,39 +724,39 @@ public class DefaultConversionServiceTests { List bar = (List) conversionService.convert(values, TypeDescriptor.forObject(values), new TypeDescriptor(getClass().getField("genericList"))); assertEquals(3, bar.size()); - assertEquals(new Integer(1), bar.get(0)); - assertEquals(new Integer(2), bar.get(1)); - assertEquals(new Integer(3), bar.get(2)); + assertEquals(Integer.valueOf(1), bar.get(0)); + assertEquals(Integer.valueOf(2), bar.get(1)); + assertEquals(Integer.valueOf(3), bar.get(2)); } @Test public void collection() { - List strings = new ArrayList(); + List strings = new ArrayList<>(); strings.add("3"); strings.add("9"); @SuppressWarnings("unchecked") List integers = (List) conversionService.convert(strings, TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(Integer.class))); - assertEquals(new Integer(3), integers.get(0)); - assertEquals(new Integer(9), integers.get(1)); + assertEquals(Integer.valueOf(3), integers.get(0)); + assertEquals(Integer.valueOf(9), integers.get(1)); } @Test public void convertMapToMap() throws Exception { - Map foo = new HashMap(); + Map foo = new HashMap<>(); foo.put("1", "BAR"); foo.put("2", "BAZ"); @SuppressWarnings("unchecked") - Map map = (Map) conversionService.convert(foo, + Map map = (Map) conversionService.convert(foo, TypeDescriptor.forObject(foo), new TypeDescriptor(getClass().getField("genericMap"))); - assertEquals(FooEnum.BAR, map.get(1)); - assertEquals(FooEnum.BAZ, map.get(2)); + assertEquals(Foo.BAR, map.get(1)); + assertEquals(Foo.BAZ, map.get(2)); } @Test @SuppressWarnings("rawtypes") public void convertHashMapValuesToList() { - Map hashMap = new LinkedHashMap(); + Map hashMap = new LinkedHashMap<>(); hashMap.put("1", 1); hashMap.put("2", 2); List converted = conversionService.convert(hashMap.values(), List.class); @@ -747,14 +765,14 @@ public class DefaultConversionServiceTests { @Test public void map() { - Map strings = new HashMap(); + Map strings = new HashMap<>(); strings.put("3", "9"); strings.put("6", "31"); @SuppressWarnings("unchecked") Map integers = (Map) conversionService.convert(strings, TypeDescriptor.map(Map.class, TypeDescriptor.valueOf(Integer.class), TypeDescriptor.valueOf(Integer.class))); - assertEquals(new Integer(9), integers.get(3)); - assertEquals(new Integer(31), integers.get(6)); + assertEquals(Integer.valueOf(9), integers.get(3)); + assertEquals(Integer.valueOf(31), integers.get(6)); } @Test @@ -847,13 +865,13 @@ public class DefaultConversionServiceTests { @Test(expected = ConverterNotFoundException.class) public void convertObjectToObjectNoValueOfMethodOrConstructor() { - conversionService.convert(new Long(3), SSN.class); + conversionService.convert(Long.valueOf(3), SSN.class); } @Test public void convertObjectToObjectFinderMethod() { TestEntity e = conversionService.convert(1L, TestEntity.class); - assertEquals(new Long(1), e.getId()); + assertEquals(Long.valueOf(1), e.getId()); } @Test @@ -866,29 +884,24 @@ public class DefaultConversionServiceTests { @Test public void convertObjectToObjectFinderMethodWithIdConversion() { TestEntity entity = conversionService.convert("1", TestEntity.class); - assertEquals(new Long(1), entity.getId()); + assertEquals(Long.valueOf(1), entity.getId()); } @Test - public void convertCharArrayToString() throws Exception { + public void convertCharArrayToString() { String converted = conversionService.convert(new char[] {'a', 'b', 'c'}, String.class); assertThat(converted, equalTo("a,b,c")); } @Test - public void convertStringToCharArray() throws Exception { + public void convertStringToCharArray() { char[] converted = conversionService.convert("a,b,c", char[].class); assertThat(converted, equalTo(new char[]{'a', 'b', 'c'})); } @Test - public void convertStringToCustomCharArray() throws Exception { - conversionService.addConverter(new Converter() { - @Override - public char[] convert(String source) { - return source.toCharArray(); - } - }); + public void convertStringToCustomCharArray() { + conversionService.addConverter(String.class, char[].class, String::toCharArray); char[] converted = conversionService.convert("abc", char[].class); assertThat(converted, equalTo(new char[] {'a', 'b', 'c'})); } @@ -905,16 +918,11 @@ public class DefaultConversionServiceTests { @Test public void convertCannotOptimizeArray() { - conversionService.addConverter(new Converter() { - @Override - public Byte convert(Byte source) { - return (byte) (source + 1); - } - }); + conversionService.addConverter(Byte.class, Byte.class, source -> (byte) (source + 1)); byte[] byteArray = new byte[] {1, 2, 3}; byte[] converted = conversionService.convert(byteArray, byte[].class); assertNotSame(byteArray, converted); - assertTrue(Arrays.equals(new byte[] {2, 3, 4}, converted)); + assertArrayEquals(new byte[]{2, 3, 4}, converted); } @Test @@ -953,7 +961,7 @@ public class DefaultConversionServiceTests { watch.stop(); watch.start("convert 4,000,000 manually"); for (int i = 0; i < 4000000; i++) { - new Integer(3).toString(); + Integer.valueOf(3).toString(); } watch.stop(); // System.out.println(watch.prettyPrint()); @@ -962,11 +970,11 @@ public class DefaultConversionServiceTests { // test fields and helpers - public List genericList = new ArrayList(); + public List genericList = new ArrayList<>(); public Stream genericStream; - public Map genericMap = new HashMap(); + public Map genericMap = new HashMap<>(); public EnumSet enumSet;