Пользовательский фильтр Джексона с полным связыванием данных POJO

Этот вопрос расширяет этот вопрос.

В то время как предыдущее решение отлично работает, если у вас есть только несколько полей, оно становится недостижимым, если у вас более дюжины полей. Прямо сейчас, моя текущая настройка использует полную привязку данных, поэтому у меня есть POJO, который будет использоваться Jackson для автоматического десериализации JSON.

Однако, как и прежде, некоторые поля имеют ограничения, которые необходимо передать. По сути, я ищу ответ, похожий на этот, но без необходимости устанавливать какие-либо свойства. Просто пользовательский десериализатор, который будет действовать как фильтр и выкинет пользовательское исключение, если поле не соответствует ограничению. Если к концу фильтра не было выбрано исключение, Джексон должен автоматически привязать JSON к POJO.

Ответ 1

Кажется, что Json Schema может соответствовать вашим потребностям. Он позволяет применять гибкие (и сложные) правила проверки json-строк до их десериализации. Он включает обязательные поля, проверку значений на основе регулярных выражений, отраслевые стандартные форматы (например, вы можете определить поле как формат электронной почты), кросс-зависимые зависимости (в последнем v4) и т.д.

Вышеупомянутый стандарт, не зависящий от языка. Что касается реализации Java, я использовал этот, который поддерживает последнюю версию схемы json (стандарт все еще развивается). Первоначальной интеграцией валидатора была большая работа (из-за моей очень динамичной модели json), но после этого очень удобно вводить новые правила проверки (просто нужно изменить файл схемы json)

Ответ 2

Я бы рекомендовал разделить проблемы десериализации и валидации с помощью Jackson и Hibernate Vaildator соответственно. Идея состоит в том, чтобы сначала десериализовать данные json в POJO, а затем проверить POJO в соответствии с требованием. В этом случае вы можете применить ограничения уровня класса для проверки. Ограничения уровня класса обладают большой гибкостью и могут проверять множественные коррелированные свойства, обращаясь к экземпляру объекта. Он прост, но мощный.

Обычно проверка требует более высокого уровня. Лучше справиться с этим после десриализации. Это может сделать код более легким для управления и повторного использования правил POJO и проверки.

Ответ 3

просто подумайте: если вы не заботитесь о валидации во время десериализации, попробуйте аннотацию @JsonIgnoreProperties(ignoreUnknown = true) для класса POJO. Вы можете выполнить проверку позже, когда фактическая бизнес-логика работает с классами pojo.