Почему @JsonUnwrapped игнорируется, когда класс свойства использует конвертер @JsonSerialize? - PullRequest
0 голосов
/ 04 мая 2018

Вот рабочий пример (я использую последнюю 2.9.5 версию Джексона).

public class RootClass {
    @JsonUnwrapped
    public NestedClass nested = new NestedClass();

    public static void main(String[] args) throws JsonProcessingException {
        RootClass obj = new RootClass();
        System.out.println(new ObjectMapper().writeValueAsString(obj));
    }
}

@JsonSerialize(converter = NestedClassConverter.class)
class NestedClass {
    public String foo = "fooVal";
    public String bar = "barVal";
}

class NestedClassWrapper {
    private NestedClass wrapped;

    public NestedClassWrapper(NestedClass wrapped) {
        this.wrapped = wrapped;
    }

    public String getFoo() {
        return wrapped.foo;
    }

    public String getBar() {
        return wrapped.bar;
    }
}

class NestedClassConverter extends StdConverter<NestedClass, NestedClassWrapper> {

    @Override
    public NestedClassWrapper convert(NestedClass value) {
        return new NestedClassWrapper(value);
    }
}

Если я удаляю @JsonSerialize из NestedClass, он работает как положено и выдает {"foo":"fooVal","bar":"barVal"}. Но если используется конвертер, вложенное поле не распаковывается, и я получаю: {"nested":{"bar":"barVal","foo":"fooVal"}}.

Как получить ожидаемый распакованный результат, используя converter?

Обновление: В отладчике (UnwrappingBeanPropertyWriter.class) я вижу, что в случае использования конвертера _findAndAddDynamic возвращает StdDelegationSerializer вместо UnwrappingBeanSerializer. Это ошибка или ожидаемое поведение? Есть обходной путь?

...