Обрезаются OffsetDateTime временные метки из-за чего они неправильно работают как PK

Есть композитный первичный ключ включающий в себя временную метку с миллисекундами. В базе и в @Entity хранятся миллисекунды.

При попытке открыть DetailView из ListView летит Excpetion. В дебаггере видно, что во временной метке обрезались миллисекунды и ключ уже не соответствует тому, что в базе.

Можно ли сделать так, чтобы миллисекунды не обрезались?

Проблема в том что сериализация даты/времени в URL-параметр не учитывает миллисекунды.

Самое простое решение: открывать экран деталей в диалоговом окне, тогда URL не используется:

<action id="editAction" type="list_edit">
	<properties>
		<property name="openMode" value="DIALOG"/>
	</properties>
</action>

Если нужно открывать экран через URL, то придется переопределить бин UrlParamSerializer.

Создайте класс-наследник и переопределите в нем методы serializeOffsetDateTime и parseOffsetDateTime:

package ru.dgtserv.tsproblem;

import io.jmix.core.Metadata;
import io.jmix.core.MetadataTools;
import io.jmix.flowui.UiNavigationProperties;
import io.jmix.flowui.app.propertyfilter.dateinterval.DateIntervalSupport;
import io.jmix.flowui.view.navigation.UrlParamSerializer;

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class MyUrlParamSerializer extends UrlParamSerializer {

    protected static final DateTimeFormatter MY_OFFSET_DATE_TIME_FORMATTER
            = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss.nnnnnnnnnZ");

    public MyUrlParamSerializer(UiNavigationProperties navigationProperties,
                                MetadataTools metadataTools,
                                Metadata metadata,
                                DateIntervalSupport dateIntervalSupport) {
        super(navigationProperties, metadataTools, metadata, dateIntervalSupport);
    }

    @Override
    protected String serializeOffsetDateTime(OffsetDateTime value) {
        return MY_OFFSET_DATE_TIME_FORMATTER.format(value);
    }

    @Override
    protected OffsetDateTime parseOffsetDateTime(String stringValue) {
        return OffsetDateTime.parse(stringValue, MY_OFFSET_DATE_TIME_FORMATTER);
    }
}

Затем зарегистрируйте его как бин:

@SpringBootApplication
public class TsproblemApplication implements AppShellConfigurator {
    // ...

    @Primary
    @Bean
    UrlParamSerializer urlParamSerializer(UiNavigationProperties navigationProperties,
                                          MetadataTools metadataTools,
                                          Metadata metadata,
                                          DateIntervalSupport dateIntervalSupport) {
        return new MyUrlParamSerializer(navigationProperties, metadataTools, metadata, dateIntervalSupport);
    }

Теперь URL с датой/временем будет включать наносекунды и экран деталей сможет загрузить сущность:
http://localhost:8080/datas/ts=2001-02-02T06-02-02.123456000+0400

С уважением,
Константин