Java 8 如何让运行在Java8上的IBMODM规则设计器识别Java.time.*类?
我已经在Java8VM上运行了ODM8.9.1规则设计器。Java.time.*类型显示在XOM中,但在BOM中无法识别。例如,java.time.LocalDate显示“无法口头化”,并且在Ctrl-Shift空间的口头完成选项中找不到。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
我已经在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的请求
}
}
}