2011-07-29 14 views
9

私はマーシャルする必要があるリストのマップを持っています。 XMLアダプタを作成しましたが、JAXBコンテキストを作成するときにはjava.util.List is an interface, and JAXB can't handle interfaces.を取得し続けます。リストのマップをどのようにマーシャリングする必要がありますか?JAXBマーシャリングリストのマップ

これは私のコードです:

@XmlRootElement(name = "myClass") 
public class MyClass { 

    @XmlJavaTypeAdapter(MapOfListsAdapter.class) 
    protected Map<Integer, List<Condition>> expectedResults; 

私は地図のためのアダプタMapOfListsAdapaterを書かれている:

public class MapOfListsAdapter extends XmlAdapter<List<MapOfListsEntry>, Map<Integer, List<Condition>>> { 

    @Override 
    public List<MapOfListsEntry> marshal(Map<Integer, List<Condition>> v) {...} 

    @Override 
    public Map<Integer, List<Condition>> unmarshal(List<MapOfListsEntry> v) {...} 
} 

MapOfListEntryは、これらのJAXB注釈を持っています

public class MapOfListsEntry { 

    @XmlAttribute 
    private Integer key; 

    @XmlElementRef 
    @XmlElementWrapper 
    private List<Condition> value; 
+1

のトピックを参照してくださいhttp://stackoverflow.com/questions/818327/jaxb-how-should-i-marshal-complex-nestedデータ構造。あなたが望む解決策があります。 – user219882

+0

私はそれを見ました、ありがとう。アダプターを使用したいのですが? java.util.Listを取得するのはなぜインタフェースですか、そしてJAXBはインタフェースを処理できませんか? – padis

答えて

4

私はそれを考え出しました。問題は、アダプタのValueTypeがListで、このリストがJAXBが処理できなかったタイプだということでした。アダプタのValueTypeである別の具体的なクラスにこのリストをラップすると、問題が解決しました。

アダプタ:

public class MapOfListsAdapter extends XmlAdapter<ListWrapper, Map<Integer, List<Condition>>> { 

    @Override 
    public ListWrapper marshal(Map<Integer, List<Condition>> v) {...} 

    @Override 
    public Map<Integer, List<Condition>> unmarshal(ListWrapper v) {...} 
} 

包まれたリスト:

public class ListWrapper { 

    @XmlElementRef 
    private List<MapOfListEntry> list;