JAXB忽略HashMap属性?

时间:2011-07-14 12:31:36

标签: java jaxb2

我正在使用J2SE附带的JAXB实现来序列化包含HashMap属性的bean。我认为这应该是开箱即用的 this个州

  

JAXB规范定义了Map作为bean的一个特性时的特殊处理。例如,以下bean将生成如下所示的XML:   ...

除非结构有多个级别,否则这或多或少有效,即HashMap是bean的属性,它是bean的属性 - 如下所示:

import java.util.HashMap;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.JAXB;

class bean { 
    @XmlElement public HashMap<String,String> map;
}

@XmlRootElement class b2 { 
    @XmlElement public bean b;
}


class foo { 
    public static void main(String args[]) { 
        try { 
            bean b = new bean();
            b.map = new HashMap<String,String>();
            b.map.put("a","b");
            b2 two = new b2();
            two.b=b;
            JAXB.marshal(two, System.out);  

        } catch (Exception e) { 
            System.out.println("Exception: " + e.toString());
        }
    }
}

此输出 <?xml version="1.0" encoding="UTF-8" standalone="yes"?><b2><b><map/></b></b2>而不是格式正确的HashMap。如果我使用bean注释@XmlRootElement并从@XmlElement删除map,它就有效,但我不明白为什么这是必要的。这应该是那样的吗?

1 个答案:

答案 0 :(得分:1)

您在链接的网站上提供了解释:

  

不幸的是,从2.1开始,这个处理只为bean定义   属性而不是当您将HashMap编组为顶级对象时   (例如JAXBElement中的值。)在这种情况下,HashMap将是   被视为Java bean,当你将HashMap视为bean时   没有定义getter / setter属性对,所以下面的代码会   产生以下XML:

     

Bean with Map:

m = new HashMap();
m.put("abc",1);
marshaller.marshal(new JAXBElement(new QName("root"),HashMap.class,m),System.out);
  

XML表示:

<root />
  

此问题已记录为#223,需要进行修复   更高版本的JAXB规范。