Java (取消)封送XMLGregorianCalender时出现奇怪的JaxB行为
主要类别:Java (取消)封送XMLGregorianCalender时出现奇怪的JaxB行为,java,jaxb,Java,Jaxb,主要类别: 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() throw
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);
}
}
输出:
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"/>
日期:--10+02:00
月份:空
年份:2014+02:00
2014-09-10T17:05:01.768+02:00
我的问题:
我用的是jkd1.7.67,这有点奇怪!输入字符串与输出字符串完全相同,但JaxB无法解组月份。我认为输出不正确,因此--09+2:00必须是正确的值。这是未知错误还是我的代码有问题?我写了一个适配器来解决这个问题,但可能还有其他解决方案吗 xs:gMonth类型的词法表示为--MM,后面是可选的时区 如果你使用
"... month=\"--09+02:00\" ... "
在输入字符串xml中,月份不再为空:
Day: ---10+02:00
Month: --09+02:00
Year: 2014+02:00
但是编组在JAXB中显示了一个错误,因为@month的值不正确。很抱歉,在第一个代码段中出现了复制粘贴错误。现在根据--M,月份和时区之间没有连字符。
Day: ---10+02:00
Month: --09+02:00
Year: 2014+02:00