我有ODM 8.9.1规则设计器在Java 8 VM上运行。Java.time.* 类型显示在 XOM 中,但在 BOM 中无法识别。例如,java.time.LocalDate 显示"无法言语化",并且在 Ctrl-Shift-Space 言语完成选项中找不到。 我在Java 8上有我的XOM。如何将我的 BOM 升级到 Java 8?
使用 Java 8 日期获取 BOM 的一种方法是在 XOM 中创建一个辅助方法,该方法采用口头化的 java.util.Date 并将其转换为 java.time.LocalDateTime 例如,
public static int compareDates(Date date1, Date date2) {
LocalDateTime newDate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime newDate2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime() ;
return newDate1.compareTo(newDate2);
}
虽然 ODM 8.10 已经存在了一段时间,并且包括对java.time
包的本机支持,但我使用 ODM 8.9.1 的时间更长了。以下是我如何在 ODM 8.9.1 规则应用程序中使用java.time.LocalDate
和java.time.ZonedDateTime
。
我在 BOM 项目中手动创建了一个新的 BOM 条目,并手动添加了没有成员的java.time.LocalDate
和java.time.ZonedDateTime
类。我能够用语言表达LocalDate
,但不能ZonedDateTime
。规则设计器不报告任何错误或警告,并且我能够很好地构建和执行。只要我远离 BOM 更新,在 BOM 中定义这些类就可以正常工作。
我有带有ZonedDateTime
类型的数据成员的自定义类。它们位于与 java 时间类不同的 BOM 条目中。我可以用语言表达这些成员,并通过我的自定义方法按预期使用它们,这些方法接受参数并返回类型为ZonedDateTime
的值。
下面是故障:这些ZonedDateTime
成员在词汇表中显示为系统类型'date'
,并在 Intellirule 编辑器中为系统'date'
操作建议。正如预期的那样,在规则中使用这些操作之一会产生错误,但该错误仅在 ARL 分流器中可见,而在"智能规则"选项卡或"问题"视图中不可见。
我不确定 RD 如何或为什么确定这些成员属于'date'
型。我希望找到一种方法来关闭与'date'
相关的系统语言化。同时,我只是避免使用系统'date'
操作,我的规则应用程序执行得很好。当我们最终切换到 ODM 8.10 时,我将准备就绪。
现在,关于HTDS和REST以及JSON。java.util.Date
的 Swagger 使用"日期时间"格式。java.time.ZonedDateTime
的Swagger也使用"日期时间",而对于java.time.LocalDate
,它使用"日期"。因此,java.time.ZonedDateTime
是java.util.Date
的直接替代品,而不会影响调用应用程序。但是,您必须使用自定义反序列化程序才能使其正常工作,这涉及几个步骤:
在定义数据成员的类中,必须使用批注:
@JsonDeserialize(using = CustomZonedDateTimeDeserializer.class)
private ZonedDateTime yourDateMember;
并且必须定义一个自定义反序列化程序类:
@NotBusiness
public class CustomZonedDateTimeDeserializer extends StdDeserializer<ZonedDateTime> {
private static final long serialVersionUID = -3569126727040924932L;
public CustomZonedDateTimeDeserializer() {
this(null);
}
public CustomZonedDateTimeDeserializer(final Class<?> vc) {
super(vc);
}
@Override
public ZonedDateTime deserialize(final JsonParser jsonparser, final DeserializationContext context) throws IOException {
final String dateStr = jsonparser.getText();
try {
return ZonedDateTime.parse(dateStr);
} catch (final Exception e) {
return null; // Parsing of the date failed, continue processing of the request with null value for the date
}
}
}