2011-07-14 9 views
2

私はJ2SEに付属のJAXB実装を使用して、HashMapプロパティを含むBeanを直列化しています。私はそれは豆のpropetyとして使われているとき this状態JAXBはHashMapのプロパティを無視しますか?

JAXB仕様は地図のための特別な処理を定義しているので、これは箱から出して動作する必要があることを前提とします。たとえば、次のBeanは、次のようなXMLSを生成する:...

この多かれ少なかれ作品HashMapのプロパティがあり、Beanのプロパティである。すなわち構造は、複数のレベルを持っていない限り、豆の - このような:

import java.util.HashMap; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.JAXB; 

class bean { 
    @XmlElement public HashMap<String,String> map; 
} 

@XmlRootElement class b2 { 
    @XmlElement public bean b; 
} 


class foo { 
    public static void main(String args[]) { 
     try { 
      bean b = new bean(); 
      b.map = new HashMap<String,String>(); 
      b.map.put("a","b"); 
      b2 two = new b2(); 
      two.b=b; 
      JAXB.marshal(two, System.out); 

     } catch (Exception e) { 
      System.out.println("Exception: " + e.toString()); 
     } 
    } 
} 

これは代わりに、正しくフォーマットされたHashMapの <?xml version="1.0" encoding="UTF-8" standalone="yes"?><b2><b><map/></b></b2>を出力します。 bean@XmlRootElementと注釈を付けてmapから@XmlElementを削除すると機能しますが、なぜその必要があるのか​​わかりません。それはそれのようになっているのだろうか?

答えて

1

説明は、あなたがリンク先のウェブサイト上で与えられます(例えば

残念ながら、2.1のように、この処理は専用Bean 性質のために定義されていて、トップレベルのオブジェクト としてHashMapをマーシャリングないときそのような場合、HashMapはJava beanとして扱われ、 はgetter/setterプロパティのペアを定義しないので、HashMapをJava Beanとして扱うと、 は次のXMLを生成します。 :

豆地図:

m = new HashMap(); 
m.put("abc",1); 
marshaller.marshal(new JAXBElement(new QName("root"),HashMap.class,m),System.out); 

XML表現:

<root /> 

この問題は、#223として記録されており、修正はJAXB仕様の それ以降のバージョンで発生する必要があります。

+0

'map' **はプロパティとして定義されていても動作しません。 –

+0

ここでのケースは、Beanプロパティとしてのマップの特別扱いは、@ XmlElementアノテーションは存在しません。このアノテーションを使用すると、MapはBeanとして処理されます。また、JavaBean getterおよびsetterが存在しないため、結果のXML要素は空です。 – vanje

+0

@vanje、コメントのためにありがとう - – themel

関連する問題