Как Десериализатор Джексона может рекурсивно десериализовать поля с учетом аннотаций @JsonFormat?

#java #jackson #deserialization #date-formatting

#java #jackson #Десериализация #форматирование даты

Вопрос:

В пользовательском десериализаторе для объекта я хочу вызвать десериализацию (некоторых) полей рекурсивно таким образом, чтобы соблюдались аннотации @JsonFormat. Более конкретно, вот как выглядит десериализатор:

 public class DealPatchDeserializer extends JsonDeserializer<DealPatch> {
    public DealPatch deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode root = p.readValueAsTree();
        JsonNode redeemableFromNode = root.path("redeemableFrom");
        JsonParser redeemableFromParser = redeemableFromNode.traverse(p.getCodec());
        Date date = redeemableFromParser.readValueAs(Date.class);
}
  

В этом примере JsonParser.readValueAs() не принимает аннотированные

 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
private Date redeemableTo;
  

учитывается шаблон и, таким образом, генерируется исключение из-за неизвестного (немецкого) формата даты.

Есть ли какой-либо способ десериализовать поля объекта, чтобы он соблюдал аннотированные форматы?

Ответ №1:

Если весь redeemableFrom объект не нуждается в пользовательской десериализации, вы можете проанализировать его как обычный Java-объект с аннотациями, вызвав treeToValue() . Что-то вроде этого должно сработать:

 p.getCodec().treeToValue(redeemableFromNode, RedeemableFrom.class);
  

Комментарии:

1. Нет. @JsonFormat не используется, и, как следствие, возникает исключение HttpMessageNotReadableException, поскольку значение не может быть десериализовано до даты. Я хочу сказать: у меня есть поле с аннотацией формата, как я могу вызвать десериализацию этого поля, чтобы использовался указанный формат?