我想在JAXB中自定义日期的编组。这是已经问过question的变种。我认为我会使用XMLAdapter,因为this answer问题指定。
但是我不能完全这样做,因为我反过来,从.XSD生成JAXB bean - 我无法向JAXB bean添加注释,因为它们是生成的代码。
我试过调用Marshaller.setAdapter(),但没有运气。
final Marshaller marshaller = getJaxbContext().createMarshaller();
marshaller.setSchema(kniSchema);
marshaller.setAdapter(new DateAdapter());
...
private static class DateAdapter extends XmlAdapter<String, XMLGregorianCalendar> {
@Override
public String marshal(XMLGregorianCalendar v) throws Exception {
return "hello"; //Just a test to see if it's working
}
@Override
public XMLGregorianCalendar unmarshal(String v) throws Exception {
return null; // Don't care about this for now
}
}
我生成的JAXB bean的相关部分如下所示:
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar activeSince;
当我这样做时,默认日期/ XMLGregorianCalendar编组会发生什么。就好像我没有做到这一切。
感谢任何帮助。
谢谢,
查尔斯
答案 0 :(得分:2)
更改XJC生成的Java上的绑定类型的首选方法是使用绑定自定义。
https://jaxb.dev.java.net/guide/Using_different_datatypes.html
JAXB有一个内置的表 确定使用哪些Java类 表示内置的XML Schema 类型,但这可以定制。
其中一个常见用例 定制就是取代 XMLGregorianCalendar用 更友好的日历或日期。 XMLGregorianCalendar被设计为 100%与XML Schema兼容 日期/时间系统,如提供 亚秒和秒的无限精度 多年,但往往是易用性 那些熟悉的Java课程胜出 精确的兼容性。
该页面并没有告诉您如何实际连接自定义,所以看看如何做到这一点:
http://jaxb.java.net/tutorial/section_5_6_1-Overriding-the-Datatype.html#Overriding%20the%20Datatype