Java 8 如何让运行在Java8上的IBMODM规则设计器识别Java.time.*类?

Java 8 如何让运行在Java8上的IBMODM规则设计器识别Java.time.*类?,java-8,ibm-odm,Java 8,Ibm Odm,我已经在Java8VM上运行了ODM8.9.1规则设计器。Java.time.*类型显示在XOM中,但在BOM中无法识别。例如,java.time.LocalDate显示“无法口头化”,并且在Ctrl-Shift空间的口头完成选项中找不到。 我已经在Java8上安装了XOM。如何将BOM表转换为Java 8?使用Java 8日期获取BOM表的一种方法是在XOM中创建一个helper方法,该方法采用口头化的Java.util.Date并将其转换为Java.time.LocalDateTime pu

我已经在Java8VM上运行了ODM8.9.1规则设计器。Java.time.*类型显示在XOM中,但在BOM中无法识别。例如,java.time.LocalDate显示“无法口头化”,并且在Ctrl-Shift空间的口头完成选项中找不到。
我已经在Java8上安装了XOM。如何将BOM表转换为Java 8?

使用Java 8日期获取BOM表的一种方法是在XOM中创建一个helper方法,该方法采用口头化的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表中定义这些类就可以了

我有一些自定义类,其数据成员类型为
zoneDateTime
。它们位于java时间类的单独BOM条目中。我可以用语言描述这些成员,并将它们与我的自定义方法一起使用,这些方法接受参数并返回类型为
ZonedDateTime
的值

这是一个小问题:那些
ZonedDateTime
成员在词汇表视图中显示为系统类型
'date'
,并在系统
'date'
操作的Intellirule编辑器中提出。正如所料,在规则中使用这些操作之一会产生错误,但该错误仅在ARL tap中可见,而在Intellirule选项卡或Problems视图中不可见

我不知道RD是如何或为什么确定这些成员属于
'date'
类型的。我希望找到一种方法来关闭与
'date'
相关的系统语言。同时,我只是避免使用系统
“日期”
操作,我的规则应用程序执行得很好。当我们最终切换到ODM 8.10时,我就准备好了

现在,关于HTD、REST和JSON。
java.util.Date
的招摇过市使用“日期-时间”格式。
java.time.ZonedDateTime
的招牌也使用“日期时间”,而
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
    }
}
}
@NotBusiness
公共类CustomZonedDateTimeDeserializer扩展StdDeserializer{
私有静态最终长serialVersionUID=-3569126727040924932L;
公共CustomZonedDateTimeDeserializer(){
这个(空);
}
公共CustomZonedDateTimeDeserializer(最终类vc){
超级(vc);
}
@凌驾
公共分区DateTime反序列化(最终JsonParser JsonParser,最终反序列化上下文)引发IOException{
最终字符串dateStr=jsonparser.getText();
试一试{
返回ZonedDateTime.parse(dateStr);
}捕获(最终异常e){
return null;//解析日期失败,继续处理日期值为null的请求
}
}
}