【问题标题】:In JAXB, how to use @XmlJavaTypeAdapters annotation?在 JAXB 中,如何使用 @XmlJavaTypeAdapters 注解?
【发布时间】:2011-01-12 09:15:57
【问题描述】:

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

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

所以,我打算尝试使用@XmlJavaTypeAdapters的注解,但是不知道怎么用……

请给我展示使用它的例子。

【问题讨论】:

  • 您使用的是从模式生成的代码,还是手写的 JAXB 绑定?
  • 感谢您的回复,斯卡夫曼。我是手写的,架构是从 JavaBeans 创建的,没有使用 Ant 任务的注释。

标签: java xml annotations jaxb package


【解决方案1】:

顺便说一句,您实际上不需要将 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 的好例子,比如this onethis one,以及其他几个。适应愉快!

【讨论】:

  • 谢谢 JesperSM !我将在 package-info.java 中使用 @XmlJavaTypeAdapter 注释。但是接下来,我不知道如何在 Java 中使用 package-info.java。我使用 Ant 任务编译 Java 类,package-info.java 是否排除了它?
  • 你只要在包里放一个叫package-info.java的文件,它就会被捡起来。为了比较,通过“xjc”运行一个简单的模式,看看它会产生什么。如果您对答案感到满意,请不要忘记将其标记为已接受。
  • 查看我对另一个问题的回答以获取使用 package-info.java 的示例:stackoverflow.com/questions/4687188/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多