Преобразование типа в Spring 3.0 из строки в предопределенном формате в Map с ключом в качестве типа Enum и значением в качестве любого типа - PullRequest
1 голос
/ 18 января 2012

Я пытаюсь создать универсальный конвертер, используя функцию преобразования типов в Spring 3.0 для преобразования строк в формат ": , : , : " на карту, содержащую пары ключ-значение , где ключ может иметь тип Enum, а значение может иметь любой пользовательский или встроенный тип 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  
 * "<KEY2>:<VAL>,<KEY2>:<VAL2>,<KEY3>:<VAL3>" 
 * 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

1 Ответ

1 голос
/ 18 января 2012

Вы можете реализовать GenericConverter вместо Converter и использовать ключ доступа как TypeDescriptor.getMapKeyType().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...