JAXB,公共字段映射行为与具有@XmlElement批注的私有字段不同

时间:2013-05-23 08:37:01

标签: java xml jaxb

@XmlElement注释是否应强制字段映射,因为它是公共字段?

即:字段:

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

映射确定。
无论在网络上关于映射Map的事情是什么,何时 我马上讲课,这会产生一个很好的结果:

<myMap>
    <entry>
        <key>cat</key> <value>meows</value>
    </entry>
    <entry>
        <key>dog</key> <value>barks</value>
    </entry>
</myMap>

但是如果我添加第二个相同的字段,但是因为它是私有的,所以为了映射,用@XmlElement注释:

@XmlElement
private HashMap<String, String> myMap2 = new HashMap<String, String>();

它不再起作用,即它产生一个空元素:

<myMap2/>

所以@XmlElement不只是“打开”映射。嗯,它适用于简单类型字段,即使对于列表也适用于地图。

问题是:它是对@XmlElement的错误(天真)解释吗?有没有办法完成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>

1 个答案:

答案 0 :(得分:0)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

您对JAXB规范的解释是正确的。我已经确认了您在Mac的JDK 1.7.0_21中包含的JAXB实现中看到的错误。您可以使用以下链接输入问题:

如果您使用EclipseLink MOXy作为JAXB提供程序(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html),那么您将获得正确的输出:

<?xml version="1.0" encoding="UTF-8"?>
<k>
   <myMap>
      <entry>
         <key>cat</key>
         <value>meows</value>
      </entry>
      <entry>
         <key>dog</key>
         <value>barks</value>
      </entry>
   </myMap>
   <myMap2>
      <entry>
         <key>bird</key>
         <value>tweets</value>
      </entry>
      <entry>
         <key>snake</key>
         <value>rattles</value>
      </entry>
   </myMap2>
   <myList>first</myList>
   <myList>second</myList>
</k>