我正在使用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-订阅”。显示在页面底部,并且文本
Unrecognized field "hour" (class javax.ejb.ScheduleExpression), not marked as ignorable在响应体中。
这个javax.ejb.ScheduleExpression应该如何反序列化?它看起来不像一个简单的pojo,可以简单地绑定到json模型,而且我在jberet-rest*项目中找不到任何反序列化程序。我是否应该提供自己的json (反)序列化程序?
发布于 2020-05-22 21:03:43
有一个带有jberet-ui的示例批处理应用程序(scheduleTimer),您可能想要查看它。
我以前从未见过这个错误。这可能与不同jackson库版本之间的一些变化有关(用于json绑定)。您可能希望尝试与上述jberet示例项目中使用的jackson-*依赖项完全相同的版本。
有问题的代码行在JobScheduleConfig类中。
您能从WildFly server.log中共享错误详细信息和堆栈跟踪吗?
发布于 2020-05-22 21:33:30
要解决此问题,目前可以使用以下方法。
war依赖项:
<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;
}
}https://stackoverflow.com/questions/61890981
复制相似问题