1

我在 Java 8 虚拟机上运行了 ODM 8.9.1 Rule Designer。Java.time.* 类型出现在 XOM 中,但在 BOM 中不被识别。例如,java.time.LocalDate 显示“无法用语言表达”并且无法在 Ctrl-Shift-Space 语言完成选项中找到。我在 Java 8 上安装了 XOM。如何将我的 BOM 安装到 Java 8?

4

2 回答 2

1

使用 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);

}
于 2018-11-01T11:41:50.683 回答
1

虽然 ODM 8.10 已经有一段时间了,并且包括对java.time包的本机支持,但我仍然坚持使用 ODM 8.9.1 一段时间。以下是我在 ODM 8.9.1 规则应用程序中java.time.LocalDate的使用方法。java.time.ZonedDateTime

我在我的 BOM 项目中手动创建了一个新的 BOM 条目,并手动添加了没有成员的java.time.LocalDatejava.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
    }
}
}
于 2020-12-09T21:43:22.140 回答