如何从XML生成JAXB bean,自定义JAXB编组

时间:2010-03-15 18:23:28

标签: jaxb

我想在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编组会发生什么。就好像我没有做到这一切。

感谢任何帮助。

谢谢,

查尔斯

1 个答案:

答案 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