手记

jaxb定制Date类型的序列化方式

我们先看下面的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

0人推荐
随时随地看视频
慕课网APP