2012-03-26 6 views
2

Parentという名前のクラスがあり、xsdファイルから生成され、完全なJABXアノテートを保持しますList.このクラスは変更できません。さらに、を使用してListHashMapに変換したいChild extends Parentクラスがあります。 HashMapフィールドは、同じ名前を持ち、同じxsd要素にマップされます(可能性があります)。JAXB親クラスからの再利用アノテーションとアクセスプリセットフィールド

JAXBは同じ名前のフィールドを複数回設定できますか? JAXBは、子クラスのXmlAdapterの入力として親クラスの既に埋め込まれたListを使用しようとしますか?私はこれが私が望んでいるようにうまくいかないと推測します。

このタスクはどのようにすばやく行うことができますか?

EDIT:私の実際の質問は、実際にJAXB自動生成Beanを編集するべきではなく、まだハッシュマップを使用できるようにすることです。

ここに私のコードは動作しません。マップはnullのままです。悪いコードの書式設定をしてください。ここで

public class Adapter extends XmlAdapter<LinkedList<A>,HashMap<String,A>> { 

    @Override 
    public LinkedList<A> marshal(HashMap<String, A> v) throws Exception { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public HashMap<String, A> unmarshal(LinkedList<A> v) throws Exception { 
     HashMap<String, A> map = new HashMap<String, A>(); 
     for(A a:v) { 
      map.put(a.k, a); 
     } 
     return map; 
    } 
} 

@XmlRootElement 
public class Child extends Parent { 

    @XmlElement(name="a") 
    @XmlJavaTypeAdapter(Adapter.class) 
    HashMap<String,A> map; 
} 

@XmlRootElement 
public class Parent { 

    @XmlElement(name="a") 
    LinkedList<A> values = new LinkedList<A>(); 
} 

public class XmlTest { 

    public static void main(String[] args) throws ParserConfigurationException, JAXBException, SAXException, IOException { 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(new File("test.xml")); 
     JAXBContext jc = JAXBContext.newInstance(Child.class); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Child instance = unmarshaller.unmarshal(doc,Child.class).getValue(); 
    } 
} 

クラスAは、次のとおりです。ここで

public class A { 

    @XmlAttribute 
    String v; 

    @XmlAttribute 
    String k; 
} 

test.xml

<root> 
    <a v="1" k="a"/> 
    <a v="2" k="b"/> 
</root> 
+0

(1) 'a'要素をJavaの2つのプロパティにマップすることはできません。これらの2つの異なるプロパティをXMLに戻す方法(2)クラス 'A'のマッピングがありません(3)' test.xml'を公開できますか? –

+0

@dma_kありがとうございました。私は複数のフィールドに1つの名前を使用することが問題になるかもしれませんが、多分、階層構造内で最高クラスを使用するようJAXBに指示するためのスマートな方法があります。私は今、 'afterUnmarshall'メソッドを使ってハッシュマップを構築していますが、アダプタaproachはもっと良いでしょう。しかし、それは不可能と思われる? –

答えて

1

Blaise Doughanによって例を見てください。あなたの場合、class Aclass MyMapEntryTypeclass Parentclass MyMapTypeです。 は、Parentを拡張してはなりません。中間クラスのため、JAXBは<a>要素のリストをマップできるだけです。

関連する問題