繁体   English   中英

在JAXB中,如何使用@XmlJavaTypeAdapters注释?

[英]In JAXB, how to use @XmlJavaTypeAdapters annotation?

我想在从xml解组到JAXB的Java类时将“javax.xml.datatype.XMLGregorianCalendar”更改为“java.util.Date”。

但我没有在Java类中添加@XmlJavaTypeAdapter的任何注释。

所以,我将尝试使用@XmlJavaTypeAdapters的注释,但我不知道如何使用它...

请告诉我使用它的例子。

另外,您实际上并不需要将XMLGregorianCalendar调整为Date,因为JAXB本身支持java.util.Date - 如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Example {
    @XmlSchemaType(name = "date")
    public Date publishingDate;
}

如果您需要它,@ XmlJavaTypeAdapter可以这样工作,假设您的自定义类:

public class SillyDate {
    public SillyDate(int year, int month, int day) {
        super();
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public String toString() {
      return "SillyDate [year=" + year + ", month=" + month + ", day=" + day + "]";
    }

    public int year;
    public int month;
    public int day;
}

您需要一个JAXB可以理解的类,然后在该类和自定义类之间编写一个适配器,如下所示:

public class SillyDateAdapter extends XmlAdapter<XMLGregorianCalendar, SillyDate> {
    public SillyDate unmarshal(XMLGregorianCalendar val) throws Exception {
      return new SillyDate(val.getYear(), val.getMonth(), val.getDay());
    }

    public XMLGregorianCalendar marshal(SillyDate val) throws Exception {
      return DatatypeFactory.newInstance().newXMLGregorianCalendarDate(val.year, val.month, val.day, 0);
    }
}

现在您可以在自己的类中使用它,如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Example2 {
    @XmlSchemaType(name = "date")
    @XmlJavaTypeAdapter(type=XMLGregorianCalendar.class,value =SillyDateAdapter.class)
    public SillyDate publishingDate;
}

有许多使用网络上可用的@XmlJavaTypeAdapter的好例子,比如这个这个 ,以及其他几个。 快乐适应!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM