我在 Java 8 虚拟机上运行了 ODM 8.9.1 Rule Designer。Java.time.* 类型出现在 XOM 中,但在 BOM 中不被识别。例如,java.time.LocalDate 显示“无法用语言表达”并且无法在 Ctrl-Shift-Space 语言完成选项中找到。我在 Java 8 上安装了 XOM。如何将我的 BOM 安装到 Java 8?
2 回答
使用 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
。Rule Designer 没有报告任何错误或警告,我能够很好地构建和执行。只要我远离 BOM 更新,在 BOM 中定义这些类就可以正常工作。
我有带有类型数据成员的自定义类ZonedDateTime
。它们位于与 java 时间类不同的 BOM 条目中。我可以用我的自定义方法描述这些成员并按预期使用它们,这些方法接受参数并返回 type 值ZonedDateTime
。
这是故障:这些ZonedDateTime
成员在词汇视图中显示为系统类型'date'
,并在 Intellirule 编辑器中针对系统'date'
操作提出建议。正如预期的那样,在规则中使用这些操作之一会产生错误,但该错误仅在 ARL 点击中可见,而在 Intellirule 选项卡或问题视图中不可见。
我不确定 RD 如何或为什么确定这些成员属于 type 'date'
。我希望找到一种方法来关闭与'date'
. 同时,我只是避免使用系统'date'
操作,我的规则应用程序执行得很好。当我们最终切换到 ODM 8.10 时,我就准备好了。
现在,关于 HTDS、REST 和 JSON。Swagger forjava.util.Date
使用“日期-时间”格式。Swagger forjava.time.ZonedDateTime
也使用“日期时间”,而 forjava.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
}
}
}