如何更改 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 现在可以正常工作了。
我们正在使用 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 现在可以正常工作了。