2010-10-17 74 views
6

当在Java-First中使用JAXB时,类型java.util.Date的字段/属性被编组和编组为xs:dateTime,并且所有内容都按预期工作。告诉JAXB使用注释解除日期类<xs:dateTime>

但是,如果字段/属性的类型为Object,那么JAXB会将xs:dateTime解组为XMLGregorianCalendarImpl

我需要找到一种方法,使JAXB解组日期时间值本身使用注释java.util.Date。否则,我需要在每个用例中查看所有未编组的值。

即使有一些after-unmarshall-hook在包含Object字段的类上定义并手动转换实例也会很好。但我找不到任何可以这种方式使用的东西。

请注意,由于在Apache CXF中使用了JAXB上下文,因此我有限制的访问权限。

回答

4

您可以在@XmlElement上设置type属性。

@XmlElement(type=Date.class) 
public Object getGenericDateProperty() { 
    return date; 
} 

编辑:

既然你不知道类型,你可以使用一个XmlAdapter。如果unmarshalled值是一个XMLGregorianCalendar,则将其转换为Date。有关XmlAdapter更多信息,请参阅:

+0

该对象并不总是日期。它可以是各种类型。在生成的XSD中,它被指定为xs:anyType。日期是可能的值之一。 – Iravanchi 2010-10-17 14:20:49

+0

您可以编写一个XmlAdapter来在日期类型之间进行转换。 – 2010-10-17 14:23:44

+0

我有一个XmlAdapter用于在XMLGregorianCalendar和Date之间进行转换,但我无法将其应用于使用@XmlJavaTypeAdapter的Object类型的字段 - 它导致IllegalAnnotationException。 – Iravanchi 2010-10-17 15:53:05

5

除了布莱斯Doughan的回答是:

我终于可以算出来,感谢来自布莱斯Doughan帮助。实际上,他的答案只是一个小小的变化:如果有几种类型可能会被解组为对象属性,则需要使用@XmlElements注释来放置多个@XmlElement注释。

这里是我现在的代码:

@XmlElements 
     ({ 
       @XmlElement(name = "dateValue", type = Date.class), 
       @XmlElement(name = "stringValue", type = String.class), 
       @XmlElement(name = "booleanValue", type = Boolean.class), 
       @XmlElement(name = "listValue", type = ArrayList.class), 
       @XmlElement(name = "bytesValue", type = Byte[].class) 
     }) 
public Object getFieldValue() 
{ 
    return fieldValue; 
} 

注:指定“名”这个工作是必需的,因为应该有编组/解组,以确定该内容的类型的方式。

这里有两个小问题:

  1. 你需要指定所有预期的类型的列表(这是合乎逻辑的,因为编组的情况下)

  2. 有没有办法为此属性指定一个名称。就我而言,在CXF Web服务中使用JAXB的情况下,.NET中由WSDL生成的代码将该字段命名为“Item”。例如,如果有一种方法将XML元素包装到另一个具有单一名称的元素中,则生成的代码可能会更好一些。