DefaultConversionService properly converts Object[] to int[]
Closes gh-22410
This commit is contained in:
parent
1152e67bb7
commit
ac0e5d8ec6
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue