我需要序列化(从 Java DTO 生成 Xml 字符串)并使用具有特定 date_time 模式的 XSD 持久化 DTO(Oracle DB),即 .*(+|-)((0[0-9])|(1 [0-3])):[0-5][0-9] 需要支持带偏移量的日期时间 (2022-02-12T12:49:14+05:45)。我正在使用 maven-jaxb 插件来生成 XML Java 对象和一些实用程序函数来转换 dateTime 内容。生成的类由 dateTime 对象的 XMLGregorianCalendar 组成,我使用 OffsetDateTime 来映射和持久化内容。
我无法更新模式,并且只有当 XML 日期元素包含像这样的日期 2022-02-12T12:49:14+00:00 (偏移量为零)时,XMLGregorianCalendar/OffsetDateTime 默认情况下都会转换偏移到 Z 即 2022-02-12T12:49:14Z 这对模式无效。
如何在序列化和持久化 DTO 时保持 +00:00 偏移量?我正在使用 Spring Data JPA 来持久化 DTO 以及在持久化有效的 OffsetDateTime 时遇到的另一个问题,因为 JPA 持久化了没有偏移的日期时间值。字符串类型解决了这个问题,但我不应该将字符串用于日期时间。存储这些值的正确类型是什么?
这是我的映射功能:
public static XMLGregorianCalendar toXMLGregorian(OffsetDateTime offsetDateTime) {
return DATATYPE_FACTORY.newXMLGregorianCalendar(offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
}
public static OffsetDateTime toOffSetDateTime(XMLGregorianCalendar cal) {
return cal.toGregorianCalendar().toZonedDateTime().toOffsetDateTime();
}
我试图覆盖 XMLGregorianCalendar.toXmlFormat() ,但日历对象仍然包含 Z 而不是 +00:00 并且由于模式而序列化失败。
@Override
public String toXMLFormat() {
String text = calendar.toXMLFormat();
int pos = text.indexOf('Z');
return pos < 0 ? text : text.substring(0, pos) + "+00:00";
}