Джексон: конфликтующие @JsonTypeInfo и @JsonSerialize (as = Klass.class) - PullRequest
0 голосов
/ 05 сентября 2018

Проблема

Мне нужно полиморфно JSON- (де-) сериализовать @Autowired Spring bean (я использую Spring Boot 2.0.4), используя только оригинальные свойства.

Поскольку bean-компонент «расширен», он является подклассом моего «оригинального» bean-компонента с именем класса, оканчивающимся на что-то вроде $$EnhancerBySpringCGLIB$$12345.

Пробовал до сих пор

Чтобы Джексон не пытался сериализовать «улучшенную» часть, я объявил свой бин как супертип самого себя с

@JsonSerialize(as=MyClass.class)

Он работал как задумано.

Но, когда я пытаюсь сделать полиморфную сериализацию с

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = As.WRAPPER_OBJECT)

помещенный в интерфейс, который реализует указанный класс, ключом объекта-обёртки является имя расширенного класса! Остальная часть строки JSON в порядке, то есть включены только свойства «оригинального» класса. Само собой разумеется, я не могу десериализовать его сейчас, так как упомянутый подкласс больше не существует.

Использование JsonTypeInfo.Id.NAME опровергает всю идею полиморфной десериализации, ИМХО. Я могу определить целевой класс, запросив ApplicationContext, если ничего не работает.

EDIT:

Вот пример Foo Bar:

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = As.WRAPPER_OBJECT)
public class Foo {

  private String foo = "Foo";

  @JsonSerialize(as = Bar.class)
  public static class Bar extends Foo {
    private String bar = "Bar";
  }

  public static class UnwantedMutant extends Bar {
    private String aThing = "Not welcome";
  }

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

Это печатает

{"mypackage.Foo$UnwantedMutant":{"foo":"Foo","bar":"Bar"}}

, а

{"mypackage.Foo$Bar":{"foo":"Foo","bar":"Bar"}}

ожидается / желательно.

Итак, вопрос:

есть ли какое-нибудь решение этой проблемы с "чистыми" средствами Джексона, или я просто должен с этим смириться?

1 Ответ

0 голосов
/ 05 сентября 2018

Вы пробовали с:

@JsonRootName(value = "NameOfYourClass")?

Извините, если я не понял вашего вопроса.

...