DefaultConversionService properly converts Object[] to int[]

Closes gh-22410
This commit is contained in:
Juergen Hoeller 2019-02-14 13:38:29 +01:00
parent 1152e67bb7
commit ac0e5d8ec6
2 changed files with 61 additions and 52 deletions

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.core.convert.converter.GenericConverter;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
/** /**
* Internal utilities for the conversion package. * Internal utilities for the conversion package.
@ -62,7 +63,7 @@ abstract class ConversionUtils {
// yes // yes
return true; return true;
} }
if (sourceElementType.getType().isAssignableFrom(targetElementType.getType())) { if (ClassUtils.isAssignable(sourceElementType.getType(), targetElementType.getType())) {
// maybe // maybe
return true; return true;
} }

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -134,7 +134,7 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
public void testStringToByte() throws Exception { public void testStringToByte() {
assertEquals(Byte.valueOf("1"), conversionService.convert("1", Byte.class)); assertEquals(Byte.valueOf("1"), conversionService.convert("1", Byte.class));
} }
@ -225,12 +225,12 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
public void testStringToEnum() throws Exception { public void testStringToEnum() {
assertEquals(Foo.BAR, conversionService.convert("BAR", Foo.class)); assertEquals(Foo.BAR, conversionService.convert("BAR", Foo.class));
} }
@Test @Test
public void testStringToEnumWithSubclass() throws Exception { public void testStringToEnumWithSubclass() {
assertEquals(SubFoo.BAZ, conversionService.convert("BAZ", SubFoo.BAR.getClass())); assertEquals(SubFoo.BAZ, conversionService.convert("BAZ", SubFoo.BAR.getClass()));
} }
@ -245,12 +245,12 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
public void testIntegerToEnum() throws Exception { public void testIntegerToEnum() {
assertEquals(Foo.BAR, conversionService.convert(0, Foo.class)); assertEquals(Foo.BAR, conversionService.convert(0, Foo.class));
} }
@Test @Test
public void testIntegerToEnumWithSubclass() throws Exception { public void testIntegerToEnumWithSubclass() {
assertEquals(SubFoo.BAZ, conversionService.convert(1, SubFoo.BAR.getClass())); 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); conversionService.convert(new String[]{"1", "2", "3"}, AbstractList.class);
} }
public static enum FooEnum {
BAR, BAZ
}
@Test @Test
public void convertArrayToString() { public void convertArrayToString() {
String result = conversionService.convert(new String[] {"1", "2", "3"}, String.class); String result = conversionService.convert(new String[] {"1", "2", "3"}, String.class);
@ -525,9 +521,8 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
@SuppressWarnings("rawtypes")
public void convertStringToCollection() { 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(3, result.size());
assertEquals("1", result.get(0)); assertEquals("1", result.get(0));
assertEquals("2", result.get(1)); assertEquals("2", result.get(1));
@ -535,9 +530,8 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
@SuppressWarnings("rawtypes")
public void convertStringToCollectionWithElementConversion() throws Exception { 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"))); new TypeDescriptor(getClass().getField("genericList")));
assertEquals(3, result.size()); assertEquals(3, result.size());
assertEquals(1, result.get(0)); assertEquals(1, result.get(0));
@ -546,9 +540,8 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
@SuppressWarnings("rawtypes")
public void convertEmptyStringToCollection() { public void convertEmptyStringToCollection() {
Collection result = conversionService.convert("", Collection.class); Collection<?> result = conversionService.convert("", Collection.class);
assertEquals(0, result.size()); assertEquals(0, result.size());
} }
@ -575,25 +568,18 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
@SuppressWarnings("rawtypes") public void convertCollectionToObjectWithCustomConverter() {
public void convertCollectionToObjectWithCustomConverter() throws Exception {
List<String> source = new ArrayList<>(); List<String> source = new ArrayList<>();
source.add("A"); source.add("A");
source.add("B"); source.add("B");
conversionService.addConverter(new Converter<List, ListWrapper>() { conversionService.addConverter(List.class, ListWrapper.class, ListWrapper::new);
@Override
public ListWrapper convert(List source) {
return new ListWrapper(source);
}
});
ListWrapper result = conversionService.convert(source, ListWrapper.class); ListWrapper result = conversionService.convert(source, ListWrapper.class);
assertSame(source, result.getList()); assertSame(source, result.getList());
} }
@Test @Test
@SuppressWarnings("rawtypes")
public void convertObjectToCollection() { public void convertObjectToCollection() {
List result = conversionService.convert(3L, List.class); List<?> result = conversionService.convert(3L, List.class);
assertEquals(1, result.size()); assertEquals(1, result.size());
assertEquals(3L, result.get(0)); assertEquals(3L, result.get(0));
} }
@ -608,7 +594,7 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
public void convertArrayToArray() { public void convertStringArrayToIntegerArray() {
Integer[] result = conversionService.convert(new String[] {"1", "2", "3"}, Integer[].class); Integer[] result = conversionService.convert(new String[] {"1", "2", "3"}, Integer[].class);
assertEquals(Integer.valueOf(1), result[0]); assertEquals(Integer.valueOf(1), result[0]);
assertEquals(Integer.valueOf(2), result[1]); assertEquals(Integer.valueOf(2), result[1]);
@ -616,7 +602,7 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
public void convertArrayToPrimitiveArray() { public void convertStringArrayToIntArray() {
int[] result = conversionService.convert(new String[] {"1", "2", "3"}, int[].class); int[] result = conversionService.convert(new String[] {"1", "2", "3"}, int[].class);
assertEquals(1, result[0]); assertEquals(1, result[0]);
assertEquals(2, result[1]); assertEquals(2, result[1]);
@ -624,7 +610,39 @@ public class DefaultConversionServiceTests {
} }
@Test @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[] byteArray = new byte[] {1, 2, 3};
Byte[] converted = conversionService.convert(byteArray, Byte[].class); Byte[] converted = conversionService.convert(byteArray, Byte[].class);
assertThat(converted, equalTo(new Byte[]{1, 2, 3})); assertThat(converted, equalTo(new Byte[]{1, 2, 3}));
@ -694,7 +712,7 @@ public class DefaultConversionServiceTests {
@Test @Test
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public void convertCollectionToCollectionNotGeneric() throws Exception { public void convertCollectionToCollectionNotGeneric() {
Set<String> foo = new LinkedHashSet<>(); Set<String> foo = new LinkedHashSet<>();
foo.add("1"); foo.add("1");
foo.add("2"); foo.add("2");
@ -740,10 +758,10 @@ public class DefaultConversionServiceTests {
foo.put("1", "BAR"); foo.put("1", "BAR");
foo.put("2", "BAZ"); foo.put("2", "BAZ");
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Map<Integer, FooEnum> map = (Map<Integer, FooEnum>) conversionService.convert(foo, Map<Integer, Foo> map = (Map<Integer, Foo>) conversionService.convert(foo,
TypeDescriptor.forObject(foo), new TypeDescriptor(getClass().getField("genericMap"))); TypeDescriptor.forObject(foo), new TypeDescriptor(getClass().getField("genericMap")));
assertEquals(FooEnum.BAR, map.get(1)); assertEquals(Foo.BAR, map.get(1));
assertEquals(FooEnum.BAZ, map.get(2)); assertEquals(Foo.BAZ, map.get(2));
} }
@Test @Test
@ -881,25 +899,20 @@ public class DefaultConversionServiceTests {
} }
@Test @Test
public void convertCharArrayToString() throws Exception { public void convertCharArrayToString() {
String converted = conversionService.convert(new char[] {'a', 'b', 'c'}, String.class); String converted = conversionService.convert(new char[] {'a', 'b', 'c'}, String.class);
assertThat(converted, equalTo("a,b,c")); assertThat(converted, equalTo("a,b,c"));
} }
@Test @Test
public void convertStringToCharArray() throws Exception { public void convertStringToCharArray() {
char[] converted = conversionService.convert("a,b,c", char[].class); char[] converted = conversionService.convert("a,b,c", char[].class);
assertThat(converted, equalTo(new char[]{'a', 'b', 'c'})); assertThat(converted, equalTo(new char[]{'a', 'b', 'c'}));
} }
@Test @Test
public void convertStringToCustomCharArray() throws Exception { public void convertStringToCustomCharArray() {
conversionService.addConverter(new Converter<String, char[]>() { conversionService.addConverter(String.class, char[].class, String::toCharArray);
@Override
public char[] convert(String source) {
return source.toCharArray();
}
});
char[] converted = conversionService.convert("abc", char[].class); char[] converted = conversionService.convert("abc", char[].class);
assertThat(converted, equalTo(new char[] {'a', 'b', 'c'})); assertThat(converted, equalTo(new char[] {'a', 'b', 'c'}));
} }
@ -916,16 +929,11 @@ public class DefaultConversionServiceTests {
@Test @Test
public void convertCannotOptimizeArray() { public void convertCannotOptimizeArray() {
conversionService.addConverter(new Converter<Byte, Byte>() { conversionService.addConverter(Byte.class, Byte.class, source -> (byte) (source + 1));
@Override
public Byte convert(Byte source) {
return (byte) (source + 1);
}
});
byte[] byteArray = new byte[] {1, 2, 3}; byte[] byteArray = new byte[] {1, 2, 3};
byte[] converted = conversionService.convert(byteArray, byte[].class); byte[] converted = conversionService.convert(byteArray, byte[].class);
assertNotSame(byteArray, converted); assertNotSame(byteArray, converted);
assertTrue(Arrays.equals(new byte[] {2, 3, 4}, converted)); assertArrayEquals(new byte[]{2, 3, 4}, converted);
} }
@Test @Test
@ -977,7 +985,7 @@ public class DefaultConversionServiceTests {
public Stream<Integer> genericStream; public Stream<Integer> genericStream;
public Map<Integer, FooEnum> genericMap = new HashMap<>(); public Map<Integer, Foo> genericMap = new HashMap<>();
public EnumSet<Foo> enumSet; public EnumSet<Foo> enumSet;