Джексон использует InstantDeserializer вместо зарегистрированного CustomDeserializer для десериализации OffsetDateTime вJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Джексон использует InstantDeserializer вместо зарегистрированного CustomDeserializer для десериализации OffsetDateTime в

Сообщение Anonymous »

Внешний интерфейс отправляет даты в формате: 2024-06-01T05:55:04 из элемента управления datetime-local.
Пример контроллера 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
}
Здесь добавлен пользовательский десериализатор для OffsetDateTime:

Код: Выделить всё

@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));
}
}

}

}

Я попробовал другой подход — переопределить bean-компонент ObjectMapper по умолчанию:

Код: Выделить всё

  @Produces
@Singleton
public ObjectMapper objectMapper() {
var module = new SimpleModule();
module.addDeserializer(OffsetDateTime.class, new CustomOffsetDateTimeDeserializer());
var objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
return objectMapper;
}
Ничто из вышеперечисленного не работает, и Quarkus не может десериализовать даты. Браузер получает ответ HTTP 400 Bad Request без тела.
Я запустил отладчик и выяснил, что для десериализации OffsetDateTime используется InstantDeserializer по умолчанию.
Как это сделать правильно настроить пользовательский десериализатор для OffsetDateTime?
Должен ли я использовать другой подход для анализа дат, например 2024-06-01T05:55:04, для OffsetDateTime?

Подробнее здесь: https://stackoverflow.com/questions/786 ... zer-to-des
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»