@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>
答案 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>