Map是我们经常用的对象所以下面演示下怎么使用
1、beans里面包含一个map对象,bean对象不发生变化
@XmlRootElement(name = "beans", namespace = "http://www.example.org/studyframework_0.1") @XmlAccessorType(XmlAccessType.NONE) public class Beans { @XmlElement(name = "bean") @XmlJavaTypeAdapter(MapAdapter.class) private Map<String, Bean> beanMap; public Map<String, Bean> getBeanMap() { return beanMap; } public void setBeanMap(Map<String, Bean> beanMap) { this.beanMap = beanMap; } }
2、添加MapAdapter对象
public class MapAdapter extends XmlAdapter<Bean[], Map<String, Bean>> { @Override public Bean[] marshal(Map<String, Bean> map) throws Exception { Bean[] Beans = new Bean[map.size()]; int i = 0; Iterator<Entry<String, Bean>> it = map.entrySet().iterator(); while (it.hasNext()) { Beans[i] = new Bean(); Entry<String, Bean> entry = it.next(); Beans[i].setId(entry.getKey()); Beans[i].setClassName(entry.getValue().getClassName()); i++; } return Beans; } @Override public Map<String, Bean> unmarshal(Bean[] arg0) throws Exception { Map<String, Bean> map = new HashMap<String, Bean>(); for (Bean bean : arg0) { Bean newBean = new Bean(); newBean.setId(bean.getId()); newBean.setClassName(bean.getClassName()); map.put(bean.getId(), newBean); } return map; } }
这个类就可以使用户自己定义复杂对象,简单说明下
先说下这个范式
XmlAdapter<Bean[], Map<String, Bean>>
第1个Bean代表生成xml对象
MAP<String,Bean>代表从xml获取回来的对象
marshal方法就是把MAP对象转化为Bean[]
unmarshal把xml中的Bean[]转化为Map对象
3、调用方法如下
@Test public void testMarshallerByJaxb() throws Exception { Beans beans = new Beans(); HashMap<String, Bean> map = new HashMap<String, Bean>(); Bean beanOne = new Bean(); beanOne.setClassName("testClassOne"); beanOne.setId("testIdOne"); Bean beanTwo = new Bean(); beanTwo.setClassName("testClassTwo"); beanTwo.setId("testIdTwo"); map.put("testIdOne", beanOne); map.put("testIdTwo", beanTwo); beans.setBeanMap(map); XMLTransformed.marshallerByJaxb("test.xml", beans, Beans.class); } public void testUnmarshallerByJaxb() throws Exception { Beans actual = (Beans) XMLTransformed.unmarshallerByJaxb("test.xml", Beans.class); Assert.assertEquals("testClassOne", actual.getBeanMap().get("testIdOne").getClassName()); }