Projekt we frameworku Quarkus.
Ponieważ daty z GUI przychodzą w formacie 2024-05-01T12:12:12 z kontrolki <input type="datetime-local"> a w back-endzie daty są przechowywane jako instancje klasy OffsetDateTime to przy mapowaniu takiej daty (bez offsetu) do OffsetDateTime pojawia się błąd.
Próbowałem sobie z tym poradzić, pisząc i podpinając konwerter:
@Singleton
public class ObjectMapperConfig implements ObjectMapperCustomizer {
// tutaj dodaję moduł do Jacksona, żeby mapował OffsetDateTime według własnego deserializera
public void customize(ObjectMapper mapper) {
var module = new SimpleModule();
module.addDeserializer(OffsetDateTime.class, new CustomOffsetDateTimeDeserializer());
mapper.registerModule(module);
}
// A tu jest własny deserializer
static class CustomOffsetDateTimeDeserializer extends JsonDeserializer<OffsetDateTime> {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
// Niestety do tej metody nawet nie wchodzi
@Override
public OffsetDateTime deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
String dateString = p.getText();
try {
return OffsetDateTime.parse(dateString);
} catch (Exception e) {
var localDateTime = LocalDateTime.parse(dateString, FORMATTER);
return localDateTime.atOffset(ZoneOffset.systemDefault().getRules().getOffset(localDateTime));
}
}
}
}
Niestety do tej metody nawet nie wchodzi.
Odpaliłem debugger i sprawdziłem, że moduł jest podpięty, ale Jackson do deserializacji używa InstantDeserializer zamiast CustomOffsetDateTimeDeserializer.
Czy macie inny pomysł, jak zmusić Jacksona, aby czytał daty w formacie yyyy-MM-dd'T'HH:mm:ss (ale równie dobrze może przyjść data w innym formacie)?