Джексон: конфликтующие @JsonTypeInfo и @JsonSerialize(as=Klass.class)

Эта проблема

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

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

До сих пор пробовал

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

@JsonSerialize(as=MyClass.class)

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

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

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

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

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

РЕДАКТИРОВАТЬ:

Вот пример 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 ответ

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

@JsonRootName(value = "NameOfYourClass")?

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

Другие вопросы по тегам