Я пытаюсь создать пакетное задание с несколькими шагами и передачей объекта от шага к шагу. Для этого я использую 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 с помощью "swagger-codegen-maven-plugin" и configOptions / dateLibrary = java8, поэтому я не могу их изменить.
Я пытался добавить
<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);
}
В приложении @SpringBoot нет изменений
Есть идеи? Или хранить даты более просто, например, «2019-11-04», или заставить Джексона читать его собственный формат?