|
57 | 57 | * @author Keith Donald
|
58 | 58 | * @author Juergen Hoeller
|
59 | 59 | * @author Phillip Webb
|
| 60 | + * @author David Haraburda |
60 | 61 | */
|
61 | 62 | public class GenericConversionServiceTests {
|
62 | 63 |
|
@@ -758,6 +759,20 @@ public void testEnumWithInterfaceToStringConversion() {
|
758 | 759 | assertEquals("1", result);
|
759 | 760 | }
|
760 | 761 |
|
| 762 | + @Test |
| 763 | + public void testStringToEnumWithInterfaceConversion() { |
| 764 | + conversionService.addConverterFactory(new StringToEnumConverterFactory()); |
| 765 | + conversionService.addConverterFactory(new StringToMyEnumInterfaceConverterFactory()); |
| 766 | + assertEquals(MyEnum.A, conversionService.convert("1", MyEnum.class)); |
| 767 | + } |
| 768 | + |
| 769 | + @Test |
| 770 | + public void testStringToEnumWithBaseInterfaceConversion() { |
| 771 | + conversionService.addConverterFactory(new StringToEnumConverterFactory()); |
| 772 | + conversionService.addConverterFactory(new StringToMyEnumBaseInterfaceConverterFactory()); |
| 773 | + assertEquals(MyEnum.A, conversionService.convert("base1", MyEnum.class)); |
| 774 | + } |
| 775 | + |
761 | 776 | @Test
|
762 | 777 | public void convertNullAnnotatedStringToString() throws Exception {
|
763 | 778 | DefaultConversionService.addDefaultConverters(conversionService);
|
@@ -930,19 +945,34 @@ public int getNestedMatchAttempts() {
|
930 | 945 | }
|
931 | 946 | }
|
932 | 947 |
|
| 948 | + interface MyEnumBaseInterface { |
| 949 | + String getBaseCode(); |
| 950 | + } |
933 | 951 |
|
934 |
| - interface MyEnumInterface { |
935 |
| - |
| 952 | + interface MyEnumInterface extends MyEnumBaseInterface { |
936 | 953 | String getCode();
|
937 | 954 | }
|
938 | 955 |
|
939 | 956 | public static enum MyEnum implements MyEnumInterface {
|
940 | 957 |
|
941 |
| - A { |
942 |
| - @Override |
943 |
| - public String getCode() { |
944 |
| - return "1"; |
945 |
| - } |
| 958 | + A("1"), |
| 959 | + B("2"), |
| 960 | + C("3"); |
| 961 | + |
| 962 | + private String code; |
| 963 | + |
| 964 | + MyEnum(String code) { |
| 965 | + this.code = code; |
| 966 | + } |
| 967 | + |
| 968 | + @Override |
| 969 | + public String getCode() { |
| 970 | + return code; |
| 971 | + } |
| 972 | + |
| 973 | + @Override |
| 974 | + public String getBaseCode() { |
| 975 | + return "base" + code; |
946 | 976 | }
|
947 | 977 | }
|
948 | 978 |
|
@@ -971,6 +1001,59 @@ public String convert(T source) {
|
971 | 1001 | }
|
972 | 1002 | }
|
973 | 1003 |
|
| 1004 | + private static class StringToMyEnumInterfaceConverterFactory implements ConverterFactory<String, MyEnumInterface> { |
| 1005 | + |
| 1006 | + @SuppressWarnings("unchecked") |
| 1007 | + public <T extends MyEnumInterface> Converter<String, T> getConverter(Class<T> targetType) { |
| 1008 | + return new StringToMyEnumInterfaceConverter(targetType); |
| 1009 | + } |
| 1010 | + |
| 1011 | + private static class StringToMyEnumInterfaceConverter<T extends Enum<?> & MyEnumInterface> implements Converter<String, T> { |
| 1012 | + private final Class<T> enumType; |
| 1013 | + |
| 1014 | + public StringToMyEnumInterfaceConverter(Class<T> enumType) { |
| 1015 | + this.enumType = enumType; |
| 1016 | + } |
| 1017 | + |
| 1018 | + public T convert(String source) { |
| 1019 | + for (T value : enumType.getEnumConstants()) { |
| 1020 | + if (value.getCode().equals(source)) { |
| 1021 | + return value; |
| 1022 | + } |
| 1023 | + } |
| 1024 | + return null; |
| 1025 | + } |
| 1026 | + } |
| 1027 | + |
| 1028 | + } |
| 1029 | + |
| 1030 | + private static class StringToMyEnumBaseInterfaceConverterFactory implements ConverterFactory<String, MyEnumBaseInterface> { |
| 1031 | + |
| 1032 | + @SuppressWarnings("unchecked") |
| 1033 | + public <T extends MyEnumBaseInterface> Converter<String, T> getConverter(Class<T> targetType) { |
| 1034 | + return new StringToMyEnumBaseInterfaceConverter(targetType); |
| 1035 | + } |
| 1036 | + |
| 1037 | + private static class StringToMyEnumBaseInterfaceConverter<T extends Enum<?> & MyEnumBaseInterface> implements Converter<String, T> { |
| 1038 | + private final Class<T> enumType; |
| 1039 | + |
| 1040 | + public StringToMyEnumBaseInterfaceConverter(Class<T> enumType) { |
| 1041 | + this.enumType = enumType; |
| 1042 | + } |
| 1043 | + |
| 1044 | + public T convert(String source) { |
| 1045 | + for (T value : enumType.getEnumConstants()) { |
| 1046 | + if (value.getBaseCode().equals(source)) { |
| 1047 | + return value; |
| 1048 | + } |
| 1049 | + } |
| 1050 | + return null; |
| 1051 | + } |
| 1052 | + } |
| 1053 | + |
| 1054 | + } |
| 1055 | + |
| 1056 | + |
974 | 1057 | public static class MyStringToStringCollectionConverter implements Converter<String, Collection<String>> {
|
975 | 1058 |
|
976 | 1059 | @Override
|
|
0 commit comments