【发布时间】:2020-02-29 22:43:26
【问题描述】:
我正在尝试创建一个包含多个步骤并逐步传递对象的弹簧批处理作业。 为此,我使用了从步骤到作业上下文的 ExecutionContext。 在第一次运行时,没有问题数据一步一步地走
在下一次运行时,我收到错误:
“无法反序列化执行上下文” 原因:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造java.time.OffsetDateTime 的实例(没有创建者,如默认构造,存在):无法从对象值反序列化(没有委托-或基于属性的创建者)
我像这样在 ItemWriter 中编写上下文:
@Override
public void write(List<? extends Employee> items) throws Exception {
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
List<Employee> e = new ArrayList<Employee>();
e.addAll(items);
stepContext.put("someKey", e);
}
然后在 ItemReader(从另一个步骤)中读回它:
@BeforeStep
public void retrieveInterstepData(StepExecution stepExecution) {
JobExecution jobExecution = stepExecution.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
this.someObject = (List<Employee>) jobContext.get("someKey");
}
我检查 spring 数据库上下文,我的日期(LocalDate、OffsetDateTime、...)存储如下:
"LocalDate": {
"year": 2019,
"month": "OCTOBER",
"dayOfMonth": 30,
"monthValue": 10,
"era": ["java.time.chrono.IsoEra", "CE"],
"dayOfWeek": "WEDNESDAY",
"dayOfYear": 303,
"leapYear": false,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
}
"OffsetDateTime": {
"offset": {
"totalSeconds": 0,
"id": "Z",
"rules": {
"fixedOffset": true,
"transitionRules": ["java.util.Collections$UnmodifiableRandomAccessList", []],
"transitions": ["java.util.Collections$UnmodifiableRandomAccessList", []]
}
},
"month": "OCTOBER",
"year": 2019,
"dayOfMonth": 28,
"hour": 13,
"minute": 42,
"monthValue": 10,
"nano": 511651000,
"second": 36,
"dayOfWeek": "MONDAY",
"dayOfYear": 301
}
我想杰克逊选择这样存储它(我没有自定义) 但似乎杰克逊在下次运行时无法读取它自己的格式?!
我的存根是使用“swagger-codegen-maven-plugin”和 configOptions/dateLibrary=java8 从 swagger 生成的,所以我无法更改它们。
我尝试添加
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
还有
@PostConstruct
public void init() {
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}
在@SpringBootApplication 没有变化
有什么想法吗?要么更简单地存储日期,如“2019-11-04”,要么让杰克逊读取它自己的格式?
【问题讨论】:
标签: serialization jackson spring-batch datetimeoffset localdate