Я использую версию 2.9.0 Jackson FasterXML и столкнулся с проблемой, когда мне нужно избавиться от наличия взаимоисключающих полей во время сериализации/десериализации.
Вот краткий пример:
public class Container {
private GenericType type;
private A a; <-- fields a and b are mutually exclusive
private B b; <-- both of them use "type" field as EXTERNAL_PROPERTY to identify the correct Java Type of POJOs
}
Есть ли способ создать исключение, когда такие взаимоисключающие поля присутствуют во время сериализации/десериализации?
Решения с пользовательскими сериализаторами/десериализаторами у меня отлично работают, но мне нужны более общие функции, которые работают из коробки, например, JAXB - Choice.
@MichałZiober спасибо за ответ. На самом деле у меня есть более двух полей с разными типами, но один абстрактный класс, я не могу изменить это из-за бизнес-требований. У меня есть много мест, где такой же подход с "выбором" могут быть интегрированы, поэтому интересно, не пропустил ли я что-то в документации Джексона, я даже подумал о создании пользовательской аннотации, в которой будут объявлены все свойства и проверять классы с такой аннотацией во время выполнения.




Одно свойство
typeопределяетJava Typeдля свойствaиb. Итак,aиbопределяются в классе одинаково:private T aиprivate T b. Это также зависит от того, хотите ли вы проверить, действительно лиJSONpayloadилиJavaобъекты после десериализации. В случаеJSONвы можете проверитьJSONнаJSON Schema. В случае объектовJavaвы можете создать конструктор с аннотациейJsonCreatorи проверить в конструкторе, установлены ли два свойства. Возможно, у вас не должно быть двух свойств — только одно с псевдонимами.