gpt4 book ai didi

java - JAXB - marshall 通用类型(日期)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:31 26 4
gpt4 key购买 nike

我在使用 JAXB 编码/解码通用类型时遇到问题。一切正常,但是当我的通用字段是 Date (java.util.Date) 时,解码将生成 XMLGregorianCalendar 而不是

这是我正在谈论的一段代码:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Entity<T> {
private T field;

public Entity() {
}

public T getField() {
return field;
}

public void setField(T field) {
this.field = field;
}
}
import java.io.*;
import java.util.Date;
import javax.xml.bind.*;

public class JaxbTest {
public JaxbTest() {

Entity<Date> ent = new Entity<Date>();
ent.setField(new Date());

StringWriter sw = new StringWriter();

try {
// marshall
JAXBContext jaxbContext = JAXBContext.newInstance(Entity.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(ent, sw);

// unmarshall
JAXBContext jc = JAXBContext.newInstance(Entity.class);
Unmarshaller u = jc.createUnmarshaller();
Entity<Date> ent2 = (Entity<Date>) u.unmarshal(new StringReader(sw
.toString()));// exception is thrown here
System.out.println(ent2.getField());
} catch (JAXBException e11) {
e11.printStackTrace();
}
}

public static void main(String[] args) {
new JaxbTest();
}

}

上面的代码抛出异常:

java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl cannot be cast to java.util.Date
at JaxbTest.<init>(JaxbTest.java:31)
at JaxbTest.main(JaxbTest.java:38)

你能帮我解决一下吗?我在考虑一些仅当字段为日期时才会“激活”的适配器,但我认为这是不可能的

谢谢

最佳答案

JAXBContext 是建立在类而非类型之上的。就您的 JAXB (JSR-222) 实现而言,field 属性属于 Object 类型。如果您将以下内容添加到您的代码中:

        String xml = sw.toString();
System.out.println(xml);

您将看到输出 XML 如下。添加了 xsi:type 属性以保留文本值包含日期信息。在 unmarshal 操作中,由于 JAXB 认为属性是 Object 类型,它将识别 xsi:type 属性并将值转换为默认日期类型为 XMLGregorianCalendar

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entity>
<field xsi:type="xs:dateTime" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2012-10-29T15:20:17.763-04:00</field>
</entity>

关于java - JAXB - marshall 通用类型(日期),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13084489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com