如何更改 JAXB 编组器创建日期时间字符串,即使 XSD 需要日期?

How to change that the JAXB Marshaller creates a datetime string even though the XSD demands a date?

我们正在使用 JAXB 将 LocalDate 对象解析为 XML。即使 XSD 将目标字段指定为 xsd:date,Marshaller 也会将 xsd:datetime 字符串写入 Stream。

纠正此问题的最佳方法是什么?

您可以使用 JAXB 适配器:

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, LocalDate>
{

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T");

@Override
public Date unmarshal(String v) throws Exception
{
    return dateFormat.parse(v);
}

@Override
public String marshal(LocalDate v) throws Exception
{
    return dateFormat.format(v);
}

然后,编组时将调用 "date" 格式,输出中将有一个 "date"。

好的,我们找到问题了。在 XSD 中,元素定义如下

<xs:element name="validto" type="ValidityDateType"/>
<xs:simpleType name="ValidityDateType">
    <xs:restriction base="xs:date"/>
</xs:simpleType>

据我所知 Altova XMLSpy 负责这件漂亮的 XML...

显然 jaxb-maven-plugin 无法推断出正确的类型(即使它将成员创建为 XmlGregorianCalendar)。因此,生成的类型 class 中的成员未使用

进行注释
@XmlSchemaType(name = "date")

因此在返回 XML 的途中,JAXB 编组器无法确定是创建 XmlGregorianCalendar 的日期还是日期时间字符串表示形式。我们简化了 XSD 并且 validto 现在直接属于 "xs:date" 类型。你猜怎么着? JAXB 现在可以正常工作了。