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

时间:2011-06-16 20:32:11

标签: java xml 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绑定文件的资源。 谢谢!

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:8)

试试这个:

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<String, Date> {
        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);
    }
}

这会产生:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<event>
    <date>16_05_2011</date>
    <description>im rick james</description>
</event>

答案 2 :(得分:0)

在搜索了整个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<String, Date>{

    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("<path to your property file>");
        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也可以加载属性文件。以上代码将相应地配置您的日期。