首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jberet-ui创建基于日历的日程安排?

如何使用jberet-ui创建基于日历的日程安排?
EN

Stack Overflow用户
提问于 2020-05-19 20:23:11
回答 2查看 131关注 0票数 0

我正在使用jberet-ui (从https://github.com/jberet/jberet-ui.git的主分支构建),嵌入了jberet-rest-api,jberet-rest-common,jberet-schedule-executor和jberet-schedule-timer版本1.4.0作为依赖项。

当我尝试创建基于日历的日程表时,我从api得到了400响应

并显示消息“无法为作业安排作业执行:ag-保险-导入-lisa-订阅”。显示在页面底部,并且文本

代码语言:javascript
复制
Unrecognized field "hour" (class javax.ejb.ScheduleExpression), not marked as ignorable

在响应体中。

这个javax.ejb.ScheduleExpression应该如何反序列化?它看起来不像一个简单的pojo,可以简单地绑定到json模型,而且我在jberet-rest*项目中找不到任何反序列化程序。我是否应该提供自己的json (反)序列化程序?

EN

回答 2

Stack Overflow用户

发布于 2020-05-22 21:03:43

有一个带有jberet-ui的示例批处理应用程序(scheduleTimer),您可能想要查看它。

我以前从未见过这个错误。这可能与不同jackson库版本之间的一些变化有关(用于json绑定)。您可能希望尝试与上述jberet示例项目中使用的jackson-*依赖项完全相同的版本。

有问题的代码行在JobScheduleConfig类中。

您能从WildFly server.log中共享错误详细信息和堆栈跟踪吗?

票数 0
EN

Stack Overflow用户

发布于 2020-05-22 21:33:30

要解决此问题,目前可以使用以下方法。

war依赖项:

代码语言:javascript
复制
     <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>8.0.1</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.jberet</groupId>
        <artifactId>jberet-rest-commons</artifactId>
        <version>1.4.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jberet</groupId>
        <artifactId>jberet-schedule-executor</artifactId>
        <version>1.4.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jberet</groupId>
        <artifactId>jberet-schedule-timer</artifactId>
        <version>1.4.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jberet</groupId>
        <artifactId>jberet-rest-api</artifactId>
        <version>1.4.0.Final</version>
    </dependency>

然后创建一个json反序列化程序:

代码语言:javascript
复制
 public class ScheduleExpressionDeserializer extends JsonDeserializer<ScheduleExpression> {

    private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE;

    @Override
    public ScheduleExpression deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        ScheduleExpression scheduleExpression = new ScheduleExpression();

        // Payload example:
        // {"year":"1","month":"2","dayOfMonth":"3","dayOfWeek":"4",
        // "hour":"5","minute":"6","start":"2020-05-04T08:10:00.000Z",
        // "end":"2020-06-05T08:12:00.000Z","timezone":"Africa/Blantyre"}
        TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);

        Optional.ofNullable(treeNode.get("year"))
                .flatMap(this::parseIntegerNode)
                .ifPresent(scheduleExpression::year);

        Optional.ofNullable(treeNode.get("month"))
                .flatMap(this::parseIntegerNode)
                .ifPresent(scheduleExpression::month);

        Optional.ofNullable(treeNode.get("dayOfMonth"))
                .flatMap(this::parseIntegerNode)
                .ifPresent(scheduleExpression::dayOfMonth);

        Optional.ofNullable(treeNode.get("dayOfWeek"))
                .flatMap(this::parseIntegerNode)
                .ifPresent(scheduleExpression::dayOfWeek);

        Optional.ofNullable(treeNode.get("hour"))
                .flatMap(this::parseIntegerNode)
                .ifPresent(scheduleExpression::hour);

        Optional.ofNullable(treeNode.get("minute"))
                .flatMap(this::parseIntegerNode)
                .ifPresent(scheduleExpression::minute);


        Optional.ofNullable(treeNode.get("start"))
                .flatMap(this::parseDateTimeNode)
                .ifPresent(scheduleExpression::start);

        Optional.ofNullable(treeNode.get("end"))
                .flatMap(this::parseDateTimeNode)
                .ifPresent(scheduleExpression::end);

        Optional.ofNullable(treeNode.get("timezone"))
                .map(TreeNode::asToken)
                .map(JsonToken::asString)
                .ifPresent(scheduleExpression::timezone);

        return scheduleExpression;
    }

    private Optional<Integer> parseIntegerNode(TreeNode node) {
        if (node instanceof TextNode) {
            TextNode textNode = (TextNode) node;
            return Optional.of(textNode)
                    .map(TextNode::asInt);
        } else {
            return Optional.empty();
        }
    }


    private Optional<Date> parseDateTimeNode(TreeNode node) {
        if (node instanceof TextNode) {
            TextNode textNode = (TextNode) node;
            return Optional.of(textNode)
                    .map(TextNode::asText)
                    .map(s -> OffsetDateTime.parse(s, dateTimeFormatter))
                    .map(OffsetDateTime::toInstant)
                    .map(Date::from);
        } else {
            return Optional.empty();
        }
    }
}

并在jax-rs提供的ObjectMapper中使用它:

代码语言:javascript
复制
@Provider
public class JacksonMapperResolver implements ContextResolver<ObjectMapper> {

    @Override
    public ObjectMapper getContext(Class<?> type) {
        ObjectMapper mapper = new ObjectMapper();

        SimpleModule simpleModule = new SimpleModule("Custom deserializers");
        simpleModule.addDeserializer(ScheduleExpression.class, new ScheduleExpressionDeserializer());
        mapper.registerModule(simpleModule);
        return mapper;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61890981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档