我们先看下面的demo代码,看下jaxb序列化Date类型的默认方式:
package cn.outofmemory.jaxb; import java.util.Date; import javax.xml.bind.JAXB; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; public class JAXB_DateDemo { private Date someDate; public Date getSomeDate() { return someDate; } public void setSomeDate(Date someDate) { this.someDate = someDate; } public static void main(String[] args) { JAXB_DateDemo demo = new JAXB_DateDemo(); demo.setSomeDate(new Date()); JAXB.marshal(demo, System.out); } }
运行上面代码,将输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <JAXB_DateDemo> <someDate>2014-05-12T18:12:22.272+08:00</someDate> </JAXB_DateDemo>
可以看到Date类型被序列化成了 2014-05-12T18:12:22.272+08:00
这对实际使用没有什么影响,但是对可读性不友好。
我们可以选择我们想要的日期格式化方式,来让jaxb做序列化。我们需要添加一个XmlAdapter<String, Date>来实现Date类型的定制格式化和反序列化。
如下是JaxbDateAdapter的实现:
package cn.outofmemory.jaxb; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.xml.bind.annotation.adapters.XmlAdapter; public class JaxbDateAdapter extends XmlAdapter<String, Date> { static final String STANDARM_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; @Override public Date unmarshal(String v) throws Exception { if (v == null) { return null; } DateFormat format = new SimpleDateFormat(STANDARM_DATE_FORMAT); return format.parse(v); } @Override public String marshal(Date v) throws Exception { DateFormat format = new SimpleDateFormat(STANDARM_DATE_FORMAT); return format.format(v); } }
在这个类中我们需要实现marshal和unmarshal方法,在这个方法中实现对Date类型的定制化格式化。
有了Adapter类,我们需要在Date属性上添加这个Adapter来告诉jaxb使用它。
@XmlJavaTypeAdapter(JaxbDateAdapter.class) public Date getSomeDate() { return someDate; }
在getSomeDate()属性上添加XmlJavaTypeAdapter注解,指定Adapter类,这样就可以在此属性的Date类型上应用Adapter了,我们可以再次运行程序看下输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <JAXB_DateDemo> <someDate>2014-05-12 18:18:28.833</someDate> </JAXB_DateDemo>
这次的输出是我们定制的Date格式了。
原文链接:http://outofmemory.cn/java/jaxb/jaxb-and-java.util.Date
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦