Пример контроллера REST:< /p>
Код: Выделить всё
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ExampleResource {
@POST
public RestResponse create(Example example) {
return RestResponse.ok(exampleService.create(example));
}
}
@Data
public class Example {
@JsonProperty("creationTime")
private OffsetDateTime creationTime; // from front-end comes 2024-06-01T05:55:04
}
Код: Выделить всё
@Singleton
public class ObjectMapperConfig implements ObjectMapperCustomizer {
public void customize(ObjectMapper mapper) {
var module = new SimpleModule();
module.addDeserializer(OffsetDateTime.class, new CustomOffsetDateTimeDeserializer());
mapper.registerModule(module);
}
static class CustomOffsetDateTimeDeserializer extends JsonDeserializer {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
// figured out that this method is not called during deserialization
@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));
}
}
}
}
Код: Выделить всё
@Produces
@Singleton
public ObjectMapper objectMapper() {
var module = new SimpleModule();
module.addDeserializer(OffsetDateTime.class, new CustomOffsetDateTimeDeserializer());
var objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
return objectMapper;
}
Я запустил отладчик и выяснил, что для десериализации OffsetDateTime используется InstantDeserializer по умолчанию.
Как это сделать правильно настроить пользовательский десериализатор для OffsetDateTime?
Должен ли я использовать другой подход для анализа дат, например 2024-06-01T05:55:04, для OffsetDateTime?
Подробнее здесь: https://stackoverflow.com/questions/786 ... zer-to-des
Мобильная версия