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必須是正確的值。這是一個未知的錯誤,或者是我的代碼有問題嗎?我寫了一個適配器來解決這個問題,但可能有另一種解決方案?
對不起,第一個代碼片段中有複製粘貼錯誤。現在根據 - M,在月份和時區之間沒有連字符。 – laune 2014-09-10 16:37:23