Проблема
Мне нужно полиморфно 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"}}
ожидается / желательно.
Итак, вопрос:
есть ли какое-нибудь решение этой проблемы с "чистыми" средствами Джексона, или я просто должен с этим смириться?