Я пытаюсь создать весеннее пакетное задание с несколькими шагами и передавать объект от шага к шагу. Для этого я использую 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);
}
В @SpringBootApplication никаких изменений
Любые идеи ? Либо хранить даты проще, например «2019-11-04», либо заставить Джексона читать свой собственный формат?