spring 3.0类型转换,从预定义格式的字符串转换为键为Enum类型、值为任何类型的Map



我正试图使用Spring 3.0的"类型转换"功能创建一个通用转换器,用于转换格式为"<KEY2>:<VAL>、<KEY 3>:<VAL3>"的字符串保存键值对的Map,其中key可以是Enum类型,value可以是任何用户定义的或Java的内置类型

下面是我试用过的代码。

注意:我不擅长使用泛型,所以如果我用错了泛型,请耐心等待。

import java.lang.reflect.GenericDeclaration;
import java.lang.reflect.TypeVariable;
import java.util.HashMap;
import java.util.Map;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
/**
 * Converts a string in a format  
 * "&lt;KEY2&gt;:&lt;VAL&gt;,&lt;KEY2&gt;:&lt;VAL2&gt;,&lt;KEY3&gt;:&lt;VAL3&gt;" 
 * to a {@link Map} instance holding the key-value pairs <i>where key 
 * can be an Enum type and value can be of any type</i>.  
 * 
 * @author jigneshg
 *
 * @param <K>
 * @param <V>
 */
public class StringToMapConvertorFactory<V> implements ConverterFactory<String, Map<Enum<?>, V>> {
    private static final String COMMA = ",";
    private static final String COLON = ":";
    @Override
    public <T extends Map<Enum<?>, V>> Converter<String, T> getConverter(
            Class<T> targetType) {
        return new StringToMapConverter<T>(targetType);
    }
    private final class StringToMapConverter<T extends Map<Enum<?>, V>> implements Converter<String,T> {
        public StringToMapConverter(Class<T> targetType) {
        }
        @SuppressWarnings("unchecked")
        @Override
        public T convert(String source) {
            checkArg(source);
            String[] keyValuePairs = source.split(COMMA);
            // value at index 0 is assumed as the key
            // value at index 0 is assumed as the value
            Map<Enum<?>,V> resultMap = new HashMap<Enum<?>, V>();
            String[] keyValueArr = null;
            String key = null;
            String value = null;
            for (String keyValuePair : keyValuePairs) {
                keyValueArr = keyValuePair.split(COLON);
                key = keyValueArr[0];
                value = keyValueArr[1];
                // TODO: How to specify the enumType here ??
                resultMap.put(Enum.valueOf(enumType, key.trim()), (V) value);
            }
            return resultMap; 
        }
        private void checkArg(String source) {
            // In the spec, null input is not allowed
            if (source == null) {
                throw new IllegalArgumentException("null source is in allowed");
            }
        }
    }
}

在代码中将键值对放入resultMap中时,我一直纠结于如何指定枚举类型。

此外,我是否采取了正确的方法来实现我的要求,或者有更好的方法可以实现这一点?

谢谢,
Jignesh

您可以实现GenericConverter而不是Converter,并将密钥类型访问为TypeDescriptor.getMapKeyType()

相关内容

  • 没有找到相关文章

最新更新