Коллеги, привет!
Camunda BPM v. 7.16, Embedded Engine (Spring Boot v. 2.5.4).
camunda.bpm.default-serialization-format: application/json
Есть проблема с десериализацией процессным движком объекта, содержащего в себе тип Instant.
Пример класса:
@Data
public class TestDto {
private Instant createDate;
private String description;
}
Тест:
@Test
void testSerialization() {
TestDto testDto = new TestDto();
testDto.setCreateDate(Instant.now());
testDto.setDescription("TEST");
VariableMap variables = new VariableMapImpl();
variables.putValue("dto", testDto);
ProcessInstance instance = runtimeService.startProcessInstanceByKey("reviewDocument", variables);
assertThat(instance).isStarted();
assertThat(instance).hasVariables("dto");
}
Ошибка:
12:03:17.692 [main] ERROR org.camunda.bpm.engine.context - ENGINE-16004 Exception while closing command context: Cannot serialize object in variable ‘dto’: SPIN/JACKSON-JSON-01009 Unable to map object ‘TestDto(createDate=2022-02-16T09:03:17.383737Z, description=TEST)’ to json node
org.camunda.bpm.engine.ProcessEngineException: Cannot serialize object in variable ‘dto’: SPIN/JACKSON-JSON-01009 Unable to map object ‘TestDto(createDate=2022-02-16T09:03:17.383737Z, description=TEST)’ to json node
Идеи?
Проблема с ошибкой решилась заменой зависимости:
<dependency>
<groupId>org.camunda.spin</groupId>
<artifactId>camunda-spin-dataformat-dataformat-all</artifactId>
</dependency>
на
<dependency>
<groupId>org.camunda.spin</groupId>
<artifactId>camunda-spin-dataformat-json-jackson</artifactId>
</dependency>
Но сериализация Instant производится в виде Timestamp:
{"createDate":1645008537.164722,"description":"TEST"}
В общем, итоги такие:
Конфигурирование Jackson на уровне приложения - не помогло:
spring:
jackson:
serialization:
write-dates-as-timestamps: false
Вопрос решился настройкой конфигурации Jackson для Camunda:
JacksonDataFormatConfigurator
public class JacksonDataFormatConfigurator implements DataFormatConfigurator<JacksonJsonDataFormat> {
public void configure(JacksonJsonDataFormat dataFormat) {
ObjectMapper objectMapper = dataFormat.getObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
public Class<JacksonJsonDataFormat> getDataFormatClass() {
return JacksonJsonDataFormat.class;
}
}
src/main/resources/META-INF/services/org.camunda.spin.spi.DataFormatConfigurator
com.easydoc.bpm.config.JacksonDataFormatConfigurator
Привет, Мстислав!
столкнулся с такой же проблемой. Но данное решение не помогло полностью в моем случае. В моем случае есть необходимость с переменными процесса в кастомном UI и там поле типа Instant возвращается
вот в таком формате.
Пробовал прописывать дополнительно настройку для общего спрингового джексона - проблема не решилась.
Если есть идеи по этому поводу - буду рад помощи!
Андрей, я нашел work around:
В REST API есть параметр запроса (deserializeValues/deserializeValue), который сообщает системе, в каком виде возвращать переменные - сериализованном или десериализованном. По-умолчанию выполняется десериализация.
Примеры запросов с сериализованным значением:
### task form variables
GET {{easyDocBpmUrl}}/engine-rest/task/29428d9f-8f17-11ec-8b23-ee2497a1ef63/form-variables?deserializeValues=false
Content-Type: application/json
Authorization: Bearer {{token}}
### task variables
GET {{easyDocBpmUrl}}/engine-rest/task/29428d9f-8f17-11ec-8b23-ee2497a1ef63/variables/dto?deserializeValue=false
Content-Type: application/json
Authorization: Bearer {{token}}
2 лайка