采用Jaxb工具类实现Java对象与XML文件互转时,有一些注意的地方,记录如下:
1、model类需要加注解 @XmlRootElement 否则报错;
2、如果model类的属性与XML节点名称不同,使用注解 @XmlElement(name="xxx") 指定;【注意】该注解必须加到getter方法上,加到属性上会报错!!!
3、集合类型,使用注解 @XmlElementWrapper 指定其包装类型;并建议同时使用注解 @XmlElement 显式指定其节点名称;
4、日期类型,使用注解 @XmlJavaTypeAdapter 指定日期格式,其参数为Class类型,继承 XmlAdapter 类;
5、数值类型,使用注解 @XmlJavaTypeAdapter 指定数值格式,其参数为Class类型,继承 XmlAdapter 类;
完整示例如下:
@XmlRootElement(name="request")
public class Group {
private Integer groupId;
private String groupName;
private List students;
private Date createTime;
private Date endDate;
private Double amount;
public Integer getGroupId() {
return groupId;
}
public void setGroupId(Integer groupId) {
this.groupId = groupId;
}
@XmlElement(name="group_name")
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
@XmlElementWrapper(name="students")
@XmlElement(name="student")
public List getStudents() {
return students;
}
public void setStudents(List students) {
this.students = students;
}
@XmlJavaTypeAdapter(JaxbDateTimeAdapter.class)
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@XmlJavaTypeAdapter(JaxbDateAdapter.class)
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
@XmlJavaTypeAdapter(JaxbNumberAdapter.class)
public Double getAmount() {
return amount;
}
public void setAmount(Double amount) {
this.amount = amount;
}
}
class JaxbDateTimeAdapter extends XmlAdapter {
private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Override
public Date unmarshal(String dateStr) throws Exception {
if (dateStr == null) {
return null;
}
DateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
return format.parse(dateStr);
}
@Override
public String marshal(Date date) throws Exception {
DateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
return format.format(date);
}
}
class JaxbDateAdapter extends XmlAdapter {
private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
@Override
public Date unmarshal(String dateStr) throws Exception {
if (dateStr == null) {
return null;
}
DateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
return format.parse(dateStr);
}
@Override
public String marshal(Date date) throws Exception {
DateFormat format = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
return format.format(date);
}
}
class JaxbNumberAdapter extends XmlAdapter {
@Override
public Number unmarshal(String v) throws Exception {
if(v == null) {
return null;
}
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CHINA);
return format.parse(v);
}
@Override
public String marshal(Number v) throws Exception {
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CHINA);
return format.format(v);
}
}
参考文献:
http://www.cnblogs.com/yjmyzz/p/xstream-jaxb-format-date-and-number.html