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