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

zhk*_*zhk 12 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));
Run Code Online (Sandbox Code Playgroud)

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

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

Pat*_*iak 14

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

@XmlJavaTypeAdapter(value=MyCustomDateAdapter.class,type=Date.class)
package com.example;
Run Code Online (Sandbox Code Playgroud)

  • 这还会处理com.example的子包,例如com.example.foo和com.example.bar吗? (2认同)

cha*_*tle 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这会产生:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<event>
    <date>16_05_2011</date>
    <description>im rick james</description>
</event>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,SimpleDateFormat"dd_mm_yyyy"将显示days,MINUTES和years.可能"dd_MM_yyyy"是更好的选择. (5认同)
  • 这不是我想要的,你的Event对象已经有一个注释,指定如何序列化日期(@XmlJavaTypeAdapter).我需要的是一个预配置的jaxb(un)marshaller,它已经知道如何(de)序列化某些类型而无需预先注释传递给它的对象. (2认同)