2010-03-15 134 views
6

我想自定义JAXB中日期的编组。这是已经询问的question的变体。我想我会使用XMLAdapter,因为this answer问题指定。如何自定义JAXB编组(如果从XML生成JAXB bean)

但是我无法完全做到这一点,因为我反其道而行,从.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发生。就好像我没有做到这一点。

任何帮助表示赞赏。

谢谢,

查尔斯

回答

2

改变对XJC生成的Java结合的类型的优选的方法是使用一个绑定定制。

https://jaxb.dev.java.net/guide/Using_different_datatypes.html

JAXB有一个内置的表 决定了Java类是用来 代表什么XML架构内置 类型,但是这是可以定制的。

一个常见的用例 定制与 友好的日历或日期更换 的XMLGregorianCalendar。 的XMLGregorianCalendar的设计是与XML模式的 日期/时间系统 100%兼容,如提供在亚秒级 无限的精度和 年,但经常使用的便利性 的那些熟悉的Java类险胜 精确兼容性。

该网页并不在这里告诉你如何实际线了定制,虽然如此,看看,看看如何做到这一点:

http://jaxb.java.net/tutorial/section_5_6_1-Overriding-the-Datatype.html#Overriding%20the%20Datatype

+0

谢谢,这工作。我是JAXB的新手,并没有意识到你可以像这样定制绑定。 – 2010-03-16 16:54:52

+0

该java.net网站已被关闭,因此该教程URL不再起作用。该教程是否有新的URL? – 2017-09-05 19:34:44