代码之家  ›  专栏  ›  技术社区  ›  cghislai

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

  •  0
  • cghislai  · 技术社区  · 6 年前

    Im使用jberet用户界面(由 https://github.com/jberet/jberet-ui.git )嵌入了jberet rest api、jberet rest common、jberet schedule executor和jberet schedule timer版本1.4.0的阴影战。作为依赖项的最终版本。

    当我尝试创建基于日历的时间表时,api会给出400个响应 error response 带有一条消息“未能为作业安排作业执行:ag保险导入lisa订阅”显示在页面底部,以及文本

    Unrecognized field "hour" (class javax.ejb.ScheduleExpression), not marked as ignorable
    
    

    在回应体中。

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

    0 回复  |  直到 6 年前
        1
  •  0
  •   cheng    6 年前

    有一个示例批处理应用程序( scheduleTimer )使用jberet用户界面,您可能想要查看它。

    我以前从未见过这种错误。这可能与不同jackson库版本(用于json绑定)的某些更改有关。您可能想尝试上面jberet示例项目中使用的jackson-*依赖项的确切版本。

    正在讨论的代码行位于 JobScheduleConfig 班

    你能从WildFly服务器上分享错误详细信息和stacktrace吗。日志

        2
  •  0
  •   cghislai    6 年前

    为了解决这个问题,目前,以下工作正在进行。

    战争依赖:

         <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反序列化程序:

     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中使用它:

    @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;
        }
    }
    
    推荐文章