From 8ab58b91143c595126872e5be43677ea3980ddc2 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 14 Feb 2019 13:38:29 +0100 Subject: [PATCH] DefaultConversionService properly converts Object[] to int[] Closes gh-22410 --- .../core/convert/support/ConversionUtils.java | 5 +- .../DefaultConversionServiceTests.java | 108 ++++++++++-------- 2 files changed, 61 insertions(+), 52 deletions(-) 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 90399bf7f4..f9a90104d3 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. @@ -22,6 +22,7 @@ import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.GenericConverter; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; /** * Internal utilities for the conversion package. @@ -62,7 +63,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 e3c1348a87..9c87c4f305 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-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. @@ -134,7 +134,7 @@ public class DefaultConversionServiceTests { } @Test - public void testStringToByte() throws Exception { + public void testStringToByte() { assertEquals(Byte.valueOf("1"), conversionService.convert("1", Byte.class)); } @@ -225,12 +225,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())); } @@ -245,12 +245,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())); } @@ -395,10 +395,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); @@ -525,9 +521,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)); @@ -535,9 +530,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)); @@ -546,9 +540,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()); } @@ -575,25 +568,18 @@ public class DefaultConversionServiceTests { } @Test - @SuppressWarnings("rawtypes") - public void convertCollectionToObjectWithCustomConverter() throws Exception { + 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)); } @@ -608,7 +594,7 @@ public class DefaultConversionServiceTests { } @Test - public void convertArrayToArray() { + public void convertStringArrayToIntegerArray() { Integer[] result = conversionService.convert(new String[] {"1", "2", "3"}, Integer[].class); assertEquals(Integer.valueOf(1), result[0]); assertEquals(Integer.valueOf(2), result[1]); @@ -616,7 +602,7 @@ public class DefaultConversionServiceTests { } @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]); @@ -624,7 +610,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})); @@ -694,7 +712,7 @@ public class DefaultConversionServiceTests { @Test @SuppressWarnings("rawtypes") - public void convertCollectionToCollectionNotGeneric() throws Exception { + public void convertCollectionToCollectionNotGeneric() { Set foo = new LinkedHashSet<>(); foo.add("1"); foo.add("2"); @@ -740,10 +758,10 @@ public class DefaultConversionServiceTests { 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 @@ -881,25 +899,20 @@ public class DefaultConversionServiceTests { } @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'})); } @@ -916,16 +929,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 @@ -977,7 +985,7 @@ public class DefaultConversionServiceTests { public Stream genericStream; - public Map genericMap = new HashMap<>(); + public Map genericMap = new HashMap<>(); public EnumSet enumSet;