Можно ли написать общий XmlAdapter - PullRequest
7 голосов
/ 02 декабря 2010

Я знаю, что я могу использовать типы Raw для написания XMLAdapter, но могу ли я использовать универсальные типы. Я попытался прочитать API ( ссылка ), но даже не заметил подсказки по этому поводу.

Например, карта:

Я хочу использовать, что-то вроде:

@XmlJavaTypeAdapter(GenericMapAdapter<String, Double>.class)//
private final HashMap<String, Double> depWageSum = //
new HashMap<String, Double>();

чтобы получить

<depWageSum>
    <entry key="RI">289.001</entry>
    <entry key="VT">499.817</entry>
    <entry key="HI">41.824</entry>
    ...
<depWageSum>

И сам класс, вероятно, будет выглядеть следующим образом:

@SuppressWarnings("serial") public class GenericMapAdapter<K, V> extends XmlAdapter<GenericMapAdapter.MapType<K, V>, Map<K, V>> {
    public static class MapType<K, V> {
        @XmlValue protected final List<MapTypeEntry<K, V>> entry = new ArrayList<MapTypeEntry<K, V>>();
        public static class MapTypeEntry<K, V> {
            @XmlAttribute protected K key;
            @XmlValue protected V value;

            private MapTypeEntry() {};
            public static <K, V> MapTypeEntry<K, V> of(final K k, final V v) {
                return new MapTypeEntry<K, V>() {{this.key = k; this.value = v;}};
    }   }   }
    @Override public Map<K, V> unmarshal(final GenericMapAdapter.MapType<K, V> v) throws Exception {
        return new HashMap<K, V>() {{ for (GenericMapAdapter.MapType.MapTypeEntry<K, V> myEntryType : v.entry)
                    this.put(myEntryType.key, myEntryType.value);}};
    }
    @Override public MapType<K, V> marshal(final Map<K, V> v) throws Exception {
        return new GenericMapAdapter.MapType<K, V>() {{for (K key : v.keySet())
                    this.entry.add(MapTypeEntry.of(key, v.get(key)));}};
}   }

1 Ответ

6 голосов
/ 03 декабря 2010

Вы не сможете сделать это, как описано.Параметры типа не будут сохранены классом.Однако вы можете ввести несколько простых подклассов, которые могут использовать логику из вашего GenericMapAdapter:

public class StringDoubleMapAdapter extends GenericMapAdapter<String, Double> {
}

Затем использовать подкласс адаптера для свойства:

@XmlJavaTypeAdapter(StringDoubleMapAdapter.class)//
private final HashMap<String, Double> depWageSum = //
new HashMap<String, Double>();

Для получения дополнительной информации о XmlAdapter см.:

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