1

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

也就是领域:

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

得到映射确定。
不管网络上关于 mappingMap的说法如何,当我 Marshall 我的班级时,这会产生一个很好的结果:

<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 已经为公共 Map 字段所做的事情?

这应该足够了,以防万一我在这里粘贴了完整但最小的源代码:

@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

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>
于 2013-05-23T10:28:40.253 回答