我已经在Java 8 vm上运行了ODM 8.9.1 Rule Designer。 Java.time。*类型显示在XOM中,但无法在BOM表中识别。例如,一个java.time.LocalDate显示“无法被语言化”,并且不能在Ctrl-Shift-Space的语言完成选项中找到。 我已经在Java 8上安装了XOM。如何将BOM升级到Java 8?
答案 0 :(得分:1)
虽然ODM 8.10已有一段时间可用,并且包括对double
软件包的本机支持,但我停留使用ODM 8.9.1的时间更长了。这就是我在ODM 8.9.1 Rule Apps中使用java.time
和java.time.LocalDate
的方式。
我在BOM表项目中手动创建了一个新的BOM表项,并手动添加了没有成员的java.time.ZonedDateTime
和java.time.LocalDate
类。我可以说java.time.ZonedDateTime
,但不能说LocalDate
。规则设计器不会报告任何错误或警告,并且我能够很好地构建和执行。只要我远离BOM更新,在BOM中定义这些类就可以正常工作。
我有一些自定义类,其数据成员的类型为ZonedDateTime
。这些位于与Java时间类分开的BOM表条目中。我可以对这些成员进行口头表达,并按预期与我的自定义方法一起使用它们,这些自定义方法接受参数并返回类型为ZonedDateTime
的值。
有一个小故障:那些ZonedDateTime
成员在词汇表中显示为系统类型ZonedDateTime
,并在Intellirule编辑器中为系统'date'
操作提出。不出所料,在规则中使用这些操作之一会产生错误,但是该错误仅在ARL点击中可见,而在Intellirule选项卡或“问题”视图中则不可见。
我不确定RD如何或为什么确定那些成员为'date'
类型。我希望找到一种方法来关闭与'date'
相关的系统语言。同时,我只是避免使用系统'date'
操作,而我的Rule Apps执行得很好。当我们最终切换到ODM 8.10时,我就准备好了。
现在,关于HTDS,REST和JSON。 'date'
的Swagger使用格式“日期时间”。 java.util.Date
的Swagger也使用“日期时间”,而java.time.ZonedDateTime
的Swagger使用“日期”。因此,java.time.LocalDate
是java.time.ZonedDateTime
的直接替代品,而不会影响调用应用程序。但是您必须使用自定义解串器才能使其正常工作,这涉及几个步骤:
在定义数据成员的类中,必须使用注释:
java.util.Date
并且您必须定义一个自定义反序列化器类:
@JsonDeserialize(using = CustomZonedDateTimeDeserializer.class)
private ZonedDateTime yourDateMember;
答案 1 :(得分:0)
使用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);
}