什麼是JAXB?
Java Architecture for XML Binding (JAXB)是一個業界的标準,是一項可以根據XML Schema産生Java類的技術。該過程中,JAXB也提供了将XML執行個體文檔反向生成Java對象樹的方法,并能将Java對象樹的内容重新寫到XML執行個體文檔。從另一方面來講,JAXB提供了快速而簡便的方法将XML模式綁定到Java表示,進而使得Java開發者在Java應用程式中能友善地結合XML資料和處理函數。
這意味着你不需要處理甚至不需要知道XML程式設計技巧就能在Java應用程式中利用平台核心XML資料的靈活性。而且,可以充分利用XML的優勢而不用依賴于複雜的XML處理模型如SAX或DOM。JAXB隐藏了細節并且取消了SAX和DOM中沒用的關系——生成的JAXB類僅描述原始模型中定義的關系。其結果是結合了高度可移植Java代碼和高度可移植的XML資料。其中這些代碼可用來建立靈活、輕便的應用程式和Web服務。
JAXB2使用了JDK的新特性。如:Annotation、GenericType等,Jaxb2需要在即将轉換的JavaBean中添加annotation注解。下面我們就來看看Jaxb2是怎麼樣完成Java對象到XML之間的互相轉換的吧。
@XmlRootElement(name="bean")
public class Info implements Serializable {
private int id;
private String name;
private String email;
@XmlAttribute(name="num")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
@Test
public void testObject() {
Info info = new Info();
info.setId(1);
info.setName("allan");
info.setEmail("[email protected]");
try {
JAXBContext context = JAXBContext.newInstance(Info.class);
Marshaller marshal = context.createMarshaller();
StringWriter writer = new StringWriter();
marshal.marshal(info, writer);
System.out.println(writer);
Unmarshaller unMarshal = context.createUnmarshaller();
StringReader reader = new StringReader(writer.toString());
Info content = (Info) unMarshal.unmarshal(reader);
System.out.println("ID:" + content.getId() + "\n名字:"
+ content.getName() + "\nemail:" + content.getEmail());
} catch (JAXBException e) {
e.printStackTrace();
}
}
上面一段是JavaBean和XML的互相轉換,傳遞了一個Info.class,這個Info不是一般的普通的bean。除了它帶有getter、setter方法外,還有Annotation注解。
上面的XmlRootElement是設定目前對象轉換成xml後的根節點,name的值是設定根節點的名稱。在getter方法上設定XmlElement表示這個方法對應的屬性是一個xml元素,如果這個注解還設定了name,那麼這個name就是轉換後xml的名稱。在一個屬性上設定XmlAttribute,表示這個方法對應的屬性在轉換xml後是父元素的一個屬性。XmlAttribute的name就是轉換後xml的屬性的name。
@XmlRootElement(name="list-beans")
public class ListBean {
private List<Object> list;
private String name;
@XmlElements({
@XmlElement(name="bean",type=Info.class)
})
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Test
public void testList() {
List<Object> list = new ArrayList<Object>();
Info info = new Info();
info.setId(1);
info.setName("allan");
info.setEmail("[email protected]");
Info info2 = new Info();
info2.setId(2);
info2.setName("allan2");
info2.setEmail("[email protected]");
list.add(info);
list.add(info2);
ListBean listBean = new ListBean();
listBean.setName("list to xml");
listBean.setList(list);
try {
JAXBContext context = JAXBContext.newInstance(ListBean.class);
Marshaller marshal = context.createMarshaller();
StringWriter writer = new StringWriter();
marshal.marshal(listBean, writer);
System.out.println(writer);
Unmarshaller unMarshal = context.createUnmarshaller();
StringReader reader = new StringReader(writer.toString());
ListBean content = (ListBean) unMarshal.unmarshal(reader);
System.out.println(content.getName());
} catch (JAXBException e) {
e.printStackTrace();
}
}
上面一段是List和XML的互相轉換
XmlElements表示是一個集合類型,然後注解在集合中存放上面類型的對象。
XmlElement表示在集合中存放的一個對象類型和元素名稱。
@XmlRootElement(name="map-beans")
public class MapBean {
Map<String,Info> map;
@XmlJavaTypeAdapter(MapAdapter.class)
public Map<String, Info> getMap() {
return map;
}
public void setMap(Map<String, Info> map) {
this.map = map;
}
}
public class MapElement {
/*@XmlElement
public String key;
@XmlElement
public Info value;
public MapElement() {
}
public MapElement(String key, Info value) {
super();
this.key = key;
this.value = value;
}*/
private String key;
private Info value;
private MapElement() {
}
public MapElement(String key, Info value) {
super();
this.key = key;
this.value = value;
}
@XmlElement
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
@XmlElement
public Info getValue() {
return value;
}
public void setValue(Info value) {
this.value = value;
}
}
public class MapAdapter extends XmlAdapter<MapElement[],Map<String,Info>>{
@Override
public Map<String, Info> unmarshal(MapElement[] param) throws Exception {
Map<String, Info> map=new HashMap<String, Info>();
for (MapElement element:param) {
//map.put(element.key, element.value);
map.put(element.getKey(), element.getValue());
}
return map;
}
@Override
public MapElement[] marshal(Map<String, Info> param) throws Exception {
MapElement[] element=new MapElement[param.size()];
int i=0;
for (Map.Entry<String, Info> entry: param.entrySet()) {
element[i++]=new MapElement(entry.getKey(),entry.getValue());
}
return element;
}
}
@Test
public void testMap() {
MapBean mapBean = new MapBean();
Info info = new Info();
info.setId(1);
info.setName("allan");
info.setEmail("[email protected]");
Info info2 = new Info();
info2.setId(2);
info2.setName("allan2");
info2.setEmail("[email protected]");
Map<String, Info> map = new HashMap<String, Info>();
map.put("NO1", info);
map.put("NO2", info2);
mapBean.setMap(map);
try {
JAXBContext context = JAXBContext.newInstance(MapBean.class);
Marshaller marshal = context.createMarshaller();
StringWriter writer = new StringWriter();
//按照jaxb的格式輸出
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshal.marshal(mapBean, writer);
System.out.println(writer);
Unmarshaller unMarshal = context.createUnmarshaller();
StringReader reader = new StringReader(writer.toString());
MapBean content = (MapBean) unMarshal.unmarshal(reader);
System.out.println(content.getMap().size());
} catch (JAXBException e) {
e.printStackTrace();
}
}
上面的map集合的getter方法有一個XmlJavaTypeAdapter,需要傳遞一個Adapter的類型。
完整代碼下載下傳位址:http://download.csdn.net/detail/allan_chan/3931401