有没有办法在我的情况下更改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绑定文件的资源。 谢谢!
答案 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也可以加载属性文件。以上代码将相应地配置您的日期。