Я создаю веб-сервис REST на Java с помощью Spring, Jersey и Hibernate (JPA).
Теперь я пытаюсь добавить поддержку для проверки в моих ресурсах. JSR-303 (Bean validation), естественно, явился подходящим выбором (я использую Hibernate Validator, который является эталонной реализацией JSR-303). Тем не менее, я сначала пытаюсь объединить некоторые концепции.
Мне кажется, что существует как минимум два вида возможных валидаций:
- Регулярная проверка в полях, например. убедитесь, что свойство не равно null, проверьте, является ли свойство
String
допустимым адресом электронной почты, проверьте, превышает ли свойствоInteger
10
и т.д. Это работает как ожидалось. Я зарегистрировал JAX-RS ExceptionMapper, который отображаетjavax.validation.ConstraintViolationException
в соответствующие ответы HTTP. - Проверка целостности данных
Я объясню, что я имею в виду именно "Проверка целостности данных" с примером. Это происходит, когда есть отношения между двумя или более ресурсами. Представьте себе два ресурса: a Product
и a Category
. A Product
имеет a Category
. Когда клиент отправляет серверу представление Product
для создания (HTTP-запрос POST), он должен сообщить Category
о продукте. Конечно, клиент должен знать категории заранее. Представьте себе в JSON что-то вроде:
{
"quantity": "10",
"state": "PRODUCED",
"category": {
"id": "123"
}
}
Ну, категория с id 123
может не существовать. Если мы попытаемся вставить это в базу данных, очевидно, мы получим исключение, связанное с внешним ключом. Поэтому я предполагаю, что мы должны проверить эти проблемы и вернуть правильное сообщение клиенту, так же как и в регулярных проверках свойств.
Теперь мои основные вопросы:
- Сейчас я выполняю проверку на уровне доступа к данным через интеграцию JPA с помощью Bean Validation. Если проверки выполняются до/после процессов сериализации, до/после операций с базой данных или и?
- Как обрабатывать проверки целостности данных? Вручную? (т.е. явно консультироваться с проверкой целостности данных базы данных). Или мы должны просто попытаться вставить его в любом случае, а затем уловить исключения базы данных (или DAO)? Bean Валидация не имеет ничего общего с такой проверкой, правильно?
- Если у вас есть опыт работы с JAX-RS/REST и Bean Validation, я был бы рад, если вы дадите мне знать. Использование групп?
Эти вопросы несколько связаны с Java, но я также надеялся получить некоторые новые перспективы по этим вопросам. Некоторые технологически независимые.:) Было бы здорово, если бы вы могли предоставить свои собственные решения для этих проблем на веб-сервисах REST.