2016-09-20 8 views
10

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

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

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

ответ

5

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

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

+1

Хм, мне было интересно, могу ли я сделать это без введения новых зависимостей. Знаете ли вы, имеет ли Джексон такой функционал? –

+0

это не так. Я не знаю никакой другой библиотеки с возможностями проверки json –

2

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

5

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

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