gpt4 book ai didi

java - 如何使用 JAXB 解码 XMLGregorianCalendar?

转载 作者:行者123 更新时间:2023-11-30 06:33:00 25 4
gpt4 key购买 nike

我尝试使用 JAXB 编写 XML 版本的 XMLGregorianCalender 来创建 XML Web 服务请求。但它不会打印出来。

    private static XMLGregorianCalendar getXmlDate() throws DatatypeConfigurationException {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
}

同一类(class)的其他地方

   try {
applicationHeader.setApplicationDate(getXmlDate());
} catch (DatatypeConfigurationException e1) {
e1.printStackTrace();
}

因此它调用 ApplicationHeader 类中生成的代码...

    @XmlElement(name = "ApplicationDate", required = true)
protected XMLGregorianCalendar applicationDate;

public XMLGregorianCalendar getApplicationDate() {
return applicationDate;
}

public void setApplicationDate(XMLGregorianCalendar value) {
this.applicationDate = value;
}
...

所以我希望得到类似的东西

    <ApplicationDate>2009-03-13</ApplicationDate>

但是我得到了

    <ApplicationDate></ApplicationDate>

我做错了什么?

最佳答案

显然 JAXB 无法处理 XMLGregorianCalender 类型。因此,我通过使用 JAXB XmlAdapter 解决了这个问题,它本质上允许我们映射任何类型的类。哪里有...

BoundType - JAXB 不知道如何处理的类型。在本例中是 XMLGregorianCalender。

ValueType - JAXB 实际上知道如何处理的类型。在本例中为 String 类型。

因此,在生成 XML 请求时,您可以扩展 XMLAdapter 以从 BoundType 转换为 ValueType。因此,我们本质上是在 ValueType 中创建类型的内存表示。

所以代码如下所示,

public class DateAdapter extends XmlAdapter<String, XMLGregorianCalendar>  {

private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// Unmarshal by converting the value type to a bound type.
@Override
public XMLGregorianCalendar unmarshal(String v) throws Exception {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(v);
}

// Marshal by converting the bound type to a value type.
@Override
public String marshal(XMLGregorianCalendar v) throws Exception {
synchronized (dateFormat) {
//return dateFormat.format(v);
return specialFormatForXmlGregorianCalander(v);
}
}

// Because you cannot format an XMLGregorianCalender typyou need to generate a GregorianCalender from it first
private String specialFormatForXmlGregorianCalander(XMLGregorianCalendar calander){
// Convert from XMLGregorianCalander to GregorianCalander
GregorianCalendar gCalender = calander.toGregorianCalendar();

// Get the date
java.util.Date date = gCalender.getTime();

//define the type of calendar to be GegorianCalander
dateFormat.setCalendar(gCalender);

// Return the string version
return dateFormat.format(date);
}
}

现在,在我的 JAXB 生成的类 ApplicatioHeader 中,我需要进行注释,以便告诉 JAXB 使用名为 DateAdaptor 的 XMLAdaptor。

    @XmlElement(name = "ApplicationDate", required = true)
@XmlJavaTypeAdapter(DateAdapter.class)
protected XMLGregorianCalendar applicationDate;

重新运行我的代码时,我得到了

    <app1:ApplicationDate>2017-08-15</app1:ApplicationDate>

关于java - 如何使用 JAXB 解码 XMLGregorianCalendar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45705336/

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