Джексон: конфликтующие @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")
?
Извините, если я не поняла ваш вопрос.