JAXB工具实现java实体类和xml之间的转换

来源:互联网 发布:网络上贷款需要些什么 编辑:程序博客网 时间:2024/04/30 00:15

1、应用场景

1、在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换

2、可以使用jersey框架实现WebService接口(resetful方式)

2、Demo

2.1 student.java 实体类,包含list(set同理)、map、Teacher、Date 类型的属性

复制代码
package jaxb;import java.util.Date;import java.util.List;import java.util.Map;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlElementWrapper;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;@XmlType(propOrder={"id","name","age","birthDay","list","teacher","map"}) //指定序列成的xml节点顺序@XmlAccessorType(value=XmlAccessType.FIELD)  //访问类型改为字段@XmlRootElementpublic class Student {     @XmlElement     private String id;     @XmlElement     private String name;     @XmlElement     private int age;     @XmlJavaTypeAdapter(value=DateAdapter.class)     @XmlElement     private Date birthDay;     @XmlElement     private List<Teacher> list;     @XmlElement     private Teacher teacher;          @XmlJavaTypeAdapter(value=MapAdapter.class)    // @XmlElementWrapper(name="role")     @XmlElement     private Map map;    public String getId() {        return id;    }        public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Date getBirthDay() {        return birthDay;    }            public void setBirthDay(Date birthDay) {        this.birthDay = birthDay;    }    public List getList() {        return list;    }      public void setList(List list) {        this.list = list;    }  public Teacher getTeacher() {    return teacher;  }   public void setTeacher(Teacher teacher) {    this.teacher = teacher;   }  public Map getMap() {    return map;  }  public void setMap(Map map) {    this.map = map; }@Overridepublic String toString() {    return "Student [id=" + id + ", name=" + name + ", age=" + age            + ", birthDay=" + birthDay + ", list=" + list + ", teacher="            + teacher + ", map=" + map + "]";} }
复制代码

2.2 Teacher.java类  注意:Teacher 类不包含@XmlRootElement节点,因为目的是转成一个XML文档,根节点只有一个

复制代码
package jaxb;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlType;@XmlAccessorType(value=XmlAccessType.FIELD)@XmlType(propOrder={"id","name","age"})public class Teacher { @XmlElement private int id; @XmlElement private String name; @XmlElement private int age;public int getId() {    return id;}public void setId(int id) {    this.id = id;}public String getName() {    return name;}public void setName(String name) {    this.name = name;}public int getAge() {    return age;}public void setAge(int age) {    this.age = age;}public Teacher(int id, String name, int age) {    super();    this.id = id;    this.name = name;    this.age = age;}public Teacher() {}@Overridepublic String toString() {    return "Teacher [id=" + id + ", name=" + name + ", age=" + age + "]";}}
复制代码

2.3 DateApdapter.java  自定义时间适配器类

 在java实体类序列化xml日期时,需要对时间进行自定义转换,jaxb提供了XmlAdapter,只要实现它后就可以自定义日期适配器

复制代码
package jaxb;import java.text.SimpleDateFormat;import java.util.Date;import javax.xml.bind.annotation.adapters.XmlAdapter;public class DateAdapter extends XmlAdapter<String, Date> {    //反序列化成日期对象Date    @Override    public Date unmarshal(String str) throws Exception {        SimpleDateFormat format = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss");        return str==null ? null:format.parse(str);    }
//序列化成xmL @Override
public String marshal(Date date) throws Exception { SimpleDateFormat format = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return date==null ? "":format.format(date); } private SimpleDateFormat getSimpleDateFormat(String pattern){ SimpleDateFormat format = new SimpleDateFormat(pattern); return format; }}
复制代码

2.4 Entry.java 类  用来封装map元素

复制代码
package jaxb;public class Entry {  private String key;  private Object value;  public String getKey() {    return key;  }  public void setKey(String key) {    this.key = key;  }   public Object getValue() {    return value;  }  public void setValue(Object value) {    this.value = value;  }  }
复制代码

2.5、MapAdpter.java   map 转换器

本人在写map转换器之后,感觉跟jaxb 默认序列化的方式没什么区别,目前还不知道在javb中需不需要特地写map转换器,希望有经验的朋友分享下

复制代码
package jaxb;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.xml.bind.annotation.adapters.XmlAdapter;public class MapAdapter extends XmlAdapter<MapAdapter.AdapterMap,Map<String,Object>> {    public static class AdapterMap {        public List<Entry> entry =new ArrayList<Entry>();        }    /**     * 功能:xml->Map<String,Object>     * @param adapterMap     * @return     * @throws Exception     */    @Override    public Map<String, Object> unmarshal(AdapterMap adapterMap) throws Exception {        Map<String, Object> map = new HashMap<String, Object>();        List entry = adapterMap.entry;        for(Entry en:adapterMap.entry){            map.put(en.getKey(), en.getValue());        }        return map;    }    /**     * 功能:map<String,Object> -> xml     */    @Override    public AdapterMap marshal(Map<String, Object> map) throws Exception {        AdapterMap adapterMap = new AdapterMap();        for (Map.Entry<String, Object> entry : map.entrySet()) {            Entry entry2 = new Entry();            entry2.setKey(entry.getKey());            entry2.setValue(entry.getValue());            adapterMap.entry.add(entry2);        }        return adapterMap;    }}
复制代码

 2.6 测试类 JaxbDemo.java

复制代码
package jaxb;import java.io.StringReader;import java.io.StringWriter;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;public class JaxbDemo {       public static void main(String[] args) {       Student stu = new Student();       stu.setId("1");       stu.setName("罗志茂");       stu.setAge(25);       stu.setBirthDay(new Date());       //list集合,set集合一样       ArrayList<Teacher> list = new ArrayList<Teacher>();       list.add(new Teacher(2,"曾利梅",22));       list.add(new Teacher(3,"黄伙林",22));       list.add(new Teacher(4,"潘志华",22));       stu.setList(list);       //在javaBean中添加javaBean       Teacher teacher = new Teacher(1,"宋瑶",22);       stu.setTeacher(teacher);       //添加map集合       HashMap<Object, Object> map = new HashMap<>();       map.put("1", "林乐贤");       map.put("2", "德甲");       stu.setMap(map);       try {        JAXBContext context = JAXBContext.newInstance(Student.class);        Marshaller marshaller = context.createMarshaller();        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);        marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");        //marshaller.marshal(stu, System.out);        StringWriter writer = new StringWriter();        marshaller.marshal(stu, writer);        System.out.println(writer.toString());        //反序列化        Unmarshaller unmarshaller = context.createUnmarshaller();        StringReader reader = new StringReader(writer.toString());        Student stu2 = (Student) unmarshaller.unmarshal(reader);        System.out.println("stu2"+stu2);    } catch (JAXBException e) {        e.getMessage();        e.printStackTrace();    }   }}
复制代码

3.测试结果

复制代码
<?xml version="1.0" encoding="GBK" standalone="yes"?><student>    <id>1</id>    <name>罗志茂</name>    <age>25</age>    <birthDay>2016-08-18 23:07:26</birthDay>    <list>        <id>2</id>        <name>曾利梅</name>        <age>22</age>    </list>    <list>        <id>3</id>        <name>黄伙林</name>        <age>22</age>    </list>    <list>        <id>4</id>        <name>潘志华</name>        <age>22</age>    </list>    <teacher>        <id>1</id>        <name>宋瑶</name>        <age>22</age>    </teacher>    <map>        <entry>            <key>2</key>            <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">德甲</value>        </entry>        <entry>            <key>1</key>            <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">林乐贤</value>        </entry>    </map></student>stu2Student [id=1, name=罗志茂, age=25, birthDay=Thu Aug 18 23:07:26 CST 2016, list=[Teacher [id=2, name=曾利梅, age=22], Teacher [id=3, name=黄伙林, age=22], Teacher [id=4, name=潘志华, age=22]], teacher=Teacher [id=1, name=宋瑶, age=22], map={2=德甲, 1=林乐贤}]
0 0
原创粉丝点击