И снова про сериализацию / десериализацию (настройки Jackson)

Коллеги, привет!

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 лайка