Общий способ генерировать исключение при наличии взаимоисключающих полей с использованием Джексона

Я использую версию 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.

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

Michał Ziober 20.02.2019 23:21

@MichałZiober спасибо за ответ. На самом деле у меня есть более двух полей с разными типами, но один абстрактный класс, я не могу изменить это из-за бизнес-требований. У меня есть много мест, где такой же подход с &quot;выбором&quot; могут быть интегрированы, поэтому интересно, не пропустил ли я что-то в документации Джексона, я даже подумал о создании пользовательской аннотации, в которой будут объявлены все свойства и проверять классы с такой аннотацией во время выполнения.

Aventes 21.02.2019 06:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
201
0

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