@XmlElement アノテーションは、パブリック フィールドであるため、フィールドのマッピングを強制する必要がありますか?
つまり、次のフィールドです。
public HashMap<String, String> myMap = new HashMap<String, String>();
マップを取得します。
マッピングMap
s について Web で言われていることとは関係なく、クラスをマーシャリングすると、次のような素晴らしい結果が得られます。
<myMap>
<entry>
<key>cat</key> <value>meows</value>
</entry>
<entry>
<key>dog</key> <value>barks</value>
</entry>
</myMap>
しかし、2番目の同一のフィールドを追加すると、それはプライベートであるため、マッピングするために次の注釈が付けられ@XmlElement
ます。
@XmlElement
private HashMap<String, String> myMap2 = new HashMap<String, String>();
つまり、空の要素が生成されます。
<myMap2/>
したがって、 @XmlElement は単にマッピングを「オン」にするだけではありません。まあ、単純なタイプのフィールドではそうです。リストでもマップではありません。
問題は、@XmlElement の間違った (素朴な) 解釈ですか? アダプターを開発せずに、パブリック Map フィールドに対して JAXB が既に行っていることを達成する方法はありますか?
完全でありながら最小限のソースコードをここに貼り付けた場合に備えて、これで十分なはずです。
@XmlRootElement
public class K {
public HashMap<String, String> myMap = new HashMap<String, String>();
@XmlElement
private HashMap<String, String> myMap2 = new HashMap<String, String>();
//An Array list that yet gets correctly mapped
@XmlElement
private ArrayList<String> myList = new ArrayList<String>();
public static void main (String [] args) throws JAXBException {
K k = new K();
k.myMap.put("dog", "barks");
k.myMap.put("cat", "meows");
k.myMap2.put("bird", "tweets");
k.myMap2.put("snake", "rattles");
k.myList.add("first");
k.myList.add("second");
k.save();
}
public void save() throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(K.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
marshaller.marshal(this, new File("K.xml"));
}
}
XML が生成されました。表示するために空の行を追加しました。
<k>
<myMap>
<entry>
<key>cat</key>
<value>meows</value>
</entry>
<entry>
<key>dog</key>
<value>barks</value>
</entry>
</myMap>
<myMap2/>
<myList>first</myList>
<myList>second</myList>