如何处理 REST Web 服务中的资源验证?
我正在使用Spring,Jersey和Hibernate(JPA)在Java中构建REST Web服务。
现在,我正在尝试在我的资源中添加对验证的支持。JSR-303(Bean验证)自然是一个合适的选择(我使用的是Hibernate Validator,它是JSR-303的参考实现)。但是,我首先尝试整合一些概念。
在我看来,至少有两种可能的验证:
-
对字段进行定期验证,例如,检查属性是否为空,检查属性是否为有效的电子邮件,检查属性是否大于 等。这按预期工作。我已经注册了一个JAX-RS ExceptionMapper,它将 的 映射到正确的HTTP响应中。
String
Integer
10
javax.validation.ConstraintViolationException
- 数据完整性验证
我将通过一个示例来解释“数据完整性验证”的确切含义。当两个或多个资源之间存在关系时,会发生这种情况。想象两个资源:a 和 .A 有一个 .当客户端向服务器发送要创建的表示形式(一个POST HTTP请求)时,它必须通知产品。当然,客户必须事先知道类别。想象一下,在JSON中,类似如下:Product
Category
Product
Category
Product
Category
{
"quantity": "10",
"state": "PRODUCED",
"category": {
"id": "123"
}
}
好吧,带有id的类别可能不存在。如果我们尝试将其插入到数据库中,显然我们会得到一个与外键相关的异常。因此,我假设我们必须验证这些问题并向客户端返回正确的消息,就像在常规属性验证中一样。123
现在,我的主要问题是:
- 现在,我正在通过 JPA 与 Bean 验证的集成,在数据访问级别执行验证。验证应该在序列化过程之前/之后,数据库操作之前/之后还是两者兼而有之?
- 如何处理数据完整性验证?手动地?(即明确咨询数据库检查数据完整性)或者我们是否应该尝试插入它,然后捕获数据库(或DAO)异常?豆类验证与这种验证无关,对吧?
- 如果您对 JAX-RS/REST 和 Bean 验证有任何经验,如果您告诉我,我会很高兴。使用组?
这些问题与Java有些关系,但我也希望从这些问题中获得一些新的观点。一些技术独立的。:)如果您可以在REST Web服务上为这些问题提供自己的解决方案,那就太好了。