1

@XmlElement アノテーションは、パブリック フィールドであるため、フィールドのマッピングを強制する必要がありますか?

つまり、次のフィールドです。

public HashMap<String, String> myMap = new HashMap<String, String>();

マップを取得します。
マッピングMaps について 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>

4

1 に答える 1