如何使用 Apache CXF 表示没有时区的日期?

2022-09-02 22:50:59

我有一个WSDL,它将元素的类型指定为xs:date。

当我使用Apache CXF生成Java类时,它将变量呈现为javax.xml.datatype.XMLGregorianCalendar(到目前为止都很好)。

当 CXF 呈现包含以下内容的 XML 文档时,它将以以下形式呈现该文档(其中 -06:00 表示时区):

2000-01-18-06:00

如何配置 CXF 不渲染时区?


答案 1
GregorianCalendar gcal = new GregorianCalendar();
start = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
start.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

不要问我为什么在每一个理智的逻辑中 - 当将XMLgregorianCalendar编组到xs:date时,它会保留时区。

我一直认为 - 时区可以更适用于xs:dateTime,但我所知道的......关于类型。

对我来说,对于 xs:date 类型,默认情况下使用时区是没有意义的,这是编组逻辑中的一个问题。


答案 2

为了完成菲利普的答案(感谢他!),也许这会帮助你们中的一些人......

我不得不在关注字段日期声明一个新的XmlAdapter,并带有注释@XmlJavaTypeAdapter

public class YourDTO {
   // ... 
   @XmlElement
   @XmlSchemaType(name = "dateTime")
   @XmlJavaTypeAdapter(type = XMLGregorianCalendar.class, value = XmlDateAdapter.class)
   public Date yourDate;
   // ...
}

适配器

public class XmlDateAdapter extends XmlAdapter<XMLGregorianCalendar, Date> {

@Override
public XMLGregorianCalendar marshal(Date date) throws Exception {
    GregorianCalendar gcal = new GregorianCalendar();
    gcal.setTime(date);
    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
    xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
    return xmlDate;
}
// ...

之前的 SOAP 消息日期格式

2017-04-18T00:00:00+02:00

之后的 SOAP 消息日期格式

2017-04-18T00:00:00


推荐