Валидация данных веб-сервиса на стороне сервера с помощью reflection

Пример реализации валидации входных данных веб-сервиса на стороне сервера с использованием reflection.

Используемые технологии и библиотеки
  • Apache CXF 3.1.6
  • Spring MVC 4.3.0.Release

1. Описание задачи

Добавить проверку (валидацию) на стороне сервера входящих данных от веб-сервиса используя рефлексию.

2. Структура проекта

wsValidStructure

Эта статья продолжает код, который описан в статье — Обработка ошибок в SOAP веб-сервисе на стороне сервера. В этой части был добавлен интерфейс ValidationErrorMsg, который описывает новую аннотацию. Валидация будет описана в классе HelloSoap.

3. Validation by reflection

Распространенной задачей при использовании веб-сервисов является валидация данных, которые передаются клиенту. Мы рассмотрим простой случай прихода некорректных значений для объекта Goods из нашей модели данных (будет отсутствовать требуемый параметр name).

Сервер предоставляет веб-метод createGoods() у которого есть два выходных параметра — id и name. Прежде чем создавать товар, необходимо удостовериться, что введенные данные от клиента верны. В противном случае мы должны передать клиенту информацию о том, какие именно данные он ввел не правильно и почему мы не можем исполнить его запрос. Причем эта информация должна быть информативной, а не просто трейс java ошибки, которую кроме программистов никто не поймет.

В данном примере намеренно не вызывается goods.setName(name) и следовательно у товара будет не инициализирован один параметр, который мы отметим как обязательный.

3.1. Goods — проверяемая модель

В этом классе мы добавим самописную аннотацию @ValidationErrorMsg, а также стандартную @XmlElement.

Здесь мы указываем, что элемент name должен быть инициализирован обязательно, а так же помечаем эту поле аннотацией с указанием некого сообщения.

3.2 @ValidationErrorMsg

Одним из приемов при валидации данных является создание собственной аннотации, в которой можно описать необходимые методы. В нашем случае мы опишем один метод, который будет выдавать понятное человеку сообщение вместо exception stack trace.

Сначала мы указываем жизненный цикл аннотации — она будет видна на этапе работы программы (в runtime). Далее мы описываем к чему будет применятся аннотация.

3.4. Reflection

Вернемся к валидации товара, в котором не было записано его название (поле name). Для этого в классе HelloSoap есть метод validateValues.

В него передается объект и класс этого объекта. В случае, если объект не существует, то мы проверяем у класса наличие аннотации ValidationErrorMsg. Т.к. для нашего класса Goods эта аннотация существует, то будет выброшено исключение с записанным значением в методе message.

Если выше с классом всё в порядке, то переходим к проверке полей данного класса. Мы получаем доступ к каждому полю и проверяем у него аннотацию XmlElement.required(). Если такая аннотация есть и поле пустое, то выбрасываем исключение с значением message для этого поля.

4. Запуск и проверка работы валидации

Для упрощения сервер и клиент были объединены в один проект. Для запуска серверной части необходимо запустить веб-сервер (в проекте, доступном в конце статьи используется Tomcat). Для запуска клиентской части нужно выполнить метод JavaStudyWS.main();

В результате увидим следующую ошибку:

Аналогично можно попробовать не создать класс вообще и тогда увидите в сообщении goods can not be empty.

 

Исходный код

4. WS Validation

Share Button
10
8802 Total Views 1 Views Today

Добавить комментарий