2014-09-10 47 views
0

主類:奇怪JAXB的行爲時(UN)編組XMLGregorianCalender

public class CheckJaxBBehavior 
{ 

    private String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Date day=\"---10+02:00\" month=\"--09--+02:00\" year=\"2014+02:00\"/>"; 

    public DateType unmarshal() throws Exception 
    { 

     ByteArrayInputStream input = new ByteArrayInputStream(xml.getBytes()); 

     JAXBContext jaxbContext = JAXBContext.newInstance(DateType.class); 

     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     DateType date = (DateType) jaxbUnmarshaller.unmarshal(input); 

     return date; 

    } 

    private static XMLGregorianCalendar createXMLGregorianDate(Date date) throws Exception 
    { 
     GregorianCalendar gregorianCalendar = new GregorianCalendar(); 
     gregorianCalendar.setTime(date); 

     XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar); 

     return xmlGregorianCalendar; 
    } 

    private void marshalAndPrint(DateType dateType) throws Exception 
    { 
     JAXBContext jaxbContext = JAXBContext.newInstance(DateType.class); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     StringWriter stringWriter = new StringWriter(); 

     jaxbMarshaller.marshal(dateType, stringWriter); 

     System.out.println(stringWriter); 
    } 

    public static void main(String[] args) throws Exception 
    { 

     CheckJaxBBehavior checkIt = new CheckJaxBBehavior(); 

     DateType dateType = checkIt.unmarshal(); 

     System.out.println("Day: " + dateType.getDay()); 
     System.out.println("Month: " + dateType.getMonth()); 
     System.out.println("Year: " + dateType.getYear()); 

     XMLGregorianCalendar xmlGregorianCalendar = createXMLGregorianDate(new Date()); 

     System.out.println(xmlGregorianCalendar.toXMLFormat()); 

     DateType dateTypeToMarshal = new DateType(); 
     dateTypeToMarshal.setDay(xmlGregorianCalendar); 
     dateTypeToMarshal.setMonth(xmlGregorianCalendar); 
     dateTypeToMarshal.setYear(xmlGregorianCalendar); 

     checkIt.marshalAndPrint(dateTypeToMarshal); 

    } 

} 

的數據類:

@XmlRootElement(name="Date") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class DateType 
{ 

    @XmlAttribute(name = "day") 
    @XmlSchemaType(name = "gDay") 
    protected XMLGregorianCalendar day; 
    @XmlAttribute(name = "month") 
    @XmlSchemaType(name = "gMonth") 
// @XmlJavaTypeAdapter(value=GMonthAdapter.class) 
    protected XMLGregorianCalendar month; 
    @XmlAttribute(name = "year", required = true) 
    @XmlSchemaType(name = "gYear") 
    protected XMLGregorianCalendar year; 

// getters and setters 
} 

輸出:

Day: ---10+02:00 
Month: null 
Year: 2014+02:00 
2014-09-10T17:05:01.768+02:00 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Date day="---10+02:00" month="--09--+02:00" year="2014+02:00"/> 

我的問題: 我使用jkd 1.7.67,這有點奇怪!輸入字符串與輸出字符串完全相同,但JaxB不能解組月。我認爲輸出不正確,所以--09 + 2:00必須是正確的值。這是一個未知的錯誤,或者是我的代碼有問題嗎?我寫了一個適配器來解決這個問題,但可能有另一種解決方案?

回答

0

xs:gMonth類型的詞彙表示爲--MM,後面帶有可選的時區。

如果您在輸入字符串的XML使用

"... month=\"--09+02:00\" ... " 

,一個月贏了* T是null更多:

Day: ---10+02:00 
Month: --09+02:00 
Year: 2014+02:00 

但是編組展品JAXB一個錯誤,因爲@month有一個不正確值。

+0

對不起,第一個代碼片段中有複製粘貼錯誤。現在根據 - M,在月份和時區之間沒有連字符。 – laune 2014-09-10 16:37:23