如何以编程方式更改默认的JAXB日期序列化?

有没有办法改变jaxb序列化/反序列化类型的默认方式,在我的情况下为日期,而不通过注释和/或通过xml jaxb绑定指定它,如http://jaxb.java.net/guide/Using_different_datatypes.html

我基本上喜欢做类似的事情:

JAXBContext jaxbContext = ...; Marshaller marshaller = jaxbContext.createMarshaller().setAdapter(new DateAdapter(dateFormat)); 

要有一个预配置的JaxBContext或Marshaller / Unmarshaller,它以自定义方式序列化/反序列化日期。

找不到任何显示如何通过注释或静态使用xml绑定文件的资源..谢谢!

这不是您正在寻找的,但它可以单独注释每个Date字段。 您可以在包级别设置XmlJavaTypeAdapter,以便包中对Date的每个引用都将使用它。 如果您的对象位于com.example包中,则应使用以下内容向其中添加package-info.java文件:

 @XmlJavaTypeAdapter(value=MyCustomDateAdapter.class,type=Date.class) package com.example; 

尝试这个:

 import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlRootElement(name = "event") public class Event { private Date date; private String description; @XmlJavaTypeAdapter(DateFormatterAdapter.class) public Date getDate() { return date; } public void setDate(final Date date) { this.date = date; } public String getDescription() { return description; } public void setDescription(final String description) { this.description = description; } private static class DateFormatterAdapter extends XmlAdapter { private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd_mm_yyyy"); @Override public Date unmarshal(final String v) throws Exception { return dateFormat.parse(v); } @Override public String marshal(final Date v) throws Exception { return dateFormat.format(v); } } public static void main(final String[] args) throws Exception { final JAXBContext context = JAXBContext.newInstance(Event.class); final Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); final Event event = new Event(); event.setDate(new Date()); event.setDescription("im rick james"); marshaller.marshal(event, System.out); } } 

这会产生:

   16_05_2011 im rick james  

在搜索了整个jaxb文档和许多教程之后,我没有找到任何可以配置日期的答案,除了我们在XMLAdapter中的硬编码。 我将属性文件放在具有日期格式的类路径中,例如:dateFormat = mm-dd-YYYY

现在您的XMLAdapter实现如下:

 import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.xml.bind.annotation.adapters.XmlAdapter; public class ConfigurableAdapterForDate extends XmlAdapter{ private static final String FORMAT = "yyyy-mm-dd"; private String formatFromFile = null; private SimpleDateFormat format = new SimpleDateFormat(); private void setFormatFromFile() throws IOException { //load property file Properties prop = new Properties(); InputStream is = this.getClass().getResourceAsStream(""); prop.load(is); //get the format from loaded property file formatFromFile = prop.getPropertyValue("dateFormat"); if(formatFromFile != null) { format.applyPattern(formatFromFile); } else { format.applyPattern(FORMAT ); } } @Override public Date unmarshal(String v) throws Exception { this.setFormatFromFile(); return format.parse(v); } @Override public String marshal(Date v) throws Exception { this.setFormatFromFile(); return format.format(v); } } 

现在,您可以将@XmlJavaTypeAdapter(ConfigurableAdapterForDate.class)用于要序列化/反序列化的日期对象。 一个是免费使用spring也可以加载属性文件。 以上代码将相应地配置您的日期。