当前位置: 首页 > 知识库问答 >
问题:

如何处理REST Web服务中的资源验证?

景凌
2023-03-14

我正在使用Spring、Jersey和Hibernate(JPA)在Java中构建REST Web服务。

现在我试图在我的资源中添加对验证的支持。JSR-303(Bean验证)自然是一个合适的选择(我使用的是JSR-303的参考实现Hibernate验证器)。然而,我试图首先巩固一些概念。

在我看来,至少有两种可能的验证:

  • 定期验证字段,例如检查属性是否为空,检查字符串属性是否是有效的电子邮件,检查整数属性是否大于10,等等。这是正常的。我已经注册了一个JAX-RS ExceptionMapper,它映射了javax。验证。将ViolationException约束为正确的HTTP响应
  • 数据完整性验证

我将用一个例子来解释我所说的“数据完整性验证”的确切含义。当两个或多个资源之间存在关系时会发生这种情况。想象两个资源:一个产品和一个类别。一个产品有一个类别。当客户端向服务器发送要创建的产品的表示形式(POST HTTP请求)时,它必须通知产品的类别。当然,客户端必须事先知道类别。想象在JSON中这样做:

{
   "quantity": "10",
   "state": "PRODUCED",
   "category": {
      "id": "123"
   }
}

有id123的类别可能不存在。如果我们试图将其插入数据库,显然我们会得到一个与外键相关的异常。所以我假设我们必须验证这些问题,并向客户端返回正确的消息,就像常规的属性验证一样。

现在,我的主要问题是:

  1. 现在,我通过JPA与Bean验证的集成,在数据访问级别执行验证。验证应该在序列化过程之前/之后、数据库操作之前/之后进行,还是两者都要进行

这些问题在某种程度上与Java有关,但我也希望对这些问题有一些新的看法。有些是技术独立的。:)如果您能在REST Web服务上为这些问题提供自己的解决方案,那就太好了。

共有3个答案

缑赤岩
2023-03-14

您可以使用jersey过滤器,在那里可以对请求数据进行一些验证。

id为123的类别可能不存在。如果我们试图将其插入数据库,显然会出现与外键相关的异常。

在这种情况下,可以依赖数据访问级别的验证。但是如果你想同步响应你的客户端,通常最好让一些服务API公开这个业务逻辑。您可能有一个像isValidClass(int id)这样的API,可以在比DAO更高的级别上查询,这样您就不必等到数据访问层遇到错误/异常。显然,这仍然意味着数据库查找(取决于您的系统),但是使用缓存或其他机制优化数据库查找以提高响应时间是一个完全不同的问题。

谈到bean验证器,您可以看看Hibernate验证器,它是JSR303实现。

祖奇
2023-03-14

现在可以通过JSR-303/JSR-349使用Jersey 2.0验证资源参数。

https://jersey.java.net/documentation/latest/bean-validation.html#d0e9301

车胤运
2023-03-14

该解决方案最终实现了JAX-RS MessageBodyReader和MessageBodyWriter的子类化Jackson的JacksonJaxbJsonProvider。我受到了令人惊叹的dropwizard方法的启发。在这个提供程序中,我们需要以某种方式注入一个验证器实例(我使用Spring进行注入,使用Hibernate验证器进行JSR-303实现)。如果您使用Hibernate ORM,不要忘记禁用实体验证,否则您将验证同一个实体两次。不过,这可能是您想要的。

然后,在这个子类MessageBodyReader中,我验证对象并抛出一个自定义InvalidEntityException,其中包含来自验证器的错误。我还创建了一个JAX-RSExceptionMapper

请注意,此MessageBodyReader检查@有效的@有效的注释。这意味着它正确地支持组。这一点很重要,因为我们可能不想在整个应用程序中进行同样的验证。例如,当我们想要进行部分更新(PUT)时。或者,例如,id属性在POST请求中必须为null,但在其他地方必须为非null。

数据完整性验证还没有完全解决。但是我计划捕获数据库异常,并将其转换为我自己的域异常(例如DataWellityExc0019),因为它对我来说似乎更有效且松散耦合。

更新:

自JAX-RS 2以来,推荐的方法是使用它的Bean验证支持。检查这里:https://jersey.java.net/documentation/latest/bean-validation.html

 类似资料:
  • 问题内容: 我正在使用Spring,Jersey和Hibernate(JPA)在Java中构建REST Web服务。 现在,我正在尝试在资源中添加对验证的支持。JSR-303(Bean验证)自然是一个合适的选择(我使用的是Hibernate Validator,它是JSR-303的参考实现)。但是,我尝试首先合并一些概念。 在我看来,至少有两种可能的验证: 定期验证字段 ,例如,检查属性是否为nu

  • 当客户端请求资源服务器使用OAuth2.0访问令牌获取受保护的资源时,该服务器如何验证该令牌?OAuth 2.0刷新令牌协议?

  • 我现在读了很多关于微服务的书,但仍然不了解其中的一些部分。我画了以下图: 每个微服务有2个访问: REST:对于超文本传输协议使用 gRPC:用于内部/后台通信/交换 如果我想登录,我可以向我的身份验证服务发送一个Http请求。但是,如果我想访问需要您连接的Stuff服务,该怎么办? 假设用户希望显示数据库中可用的内容,服务人员将首先通过与身份验证服务交换来检查连接用户的“令牌”是否正确,然后返回

  • 默认情况下,vue-loader使用css-loader 和Vue模板编译器自动处理你的样式和模板文件。 在这个编译过程中,所有的资源URL,例如 img src="...", background:url(...)和CSS@import被解析为模块依赖。 例如,url(./ image.png)将被翻译为require('./ image.png')和 <img src="../image.pn

  • 问题内容: 我的公司拥有数千个现有的xml Web服务,并开始为新项目采用AngularJs。 http://angularjs.org/上的教程专门使用json服务。看起来他们在控制器中进行了服务调用,解析了生成的JSON,并将生成的对象直接传递给视图。 我该如何处理XML?我看到四个选项: 解析它,然后将DOM对象直接传递到UI(view)。 在服务器端围绕我的XML服务放置一个JSON包装器

  • 如何使用spring oauth2和DB实现资源服务器和身份验证服务器,以及如何使用以下模式:https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql 测试数据会很棒!!!