我正在使用Spring,Jersey和Hibernate(JPA)在Java中构建REST Web服务。
现在,我正在尝试在资源中添加对验证的支持。JSR-303(Bean验证)自然是一个合适的选择(我使用的是Hibernate
Validator,它是JSR-303的参考实现)。但是,我尝试首先合并一些概念。
在我看来,至少有两种可能的验证:
String
属性是否为有效的电子邮件,检查Integer
属性是否大于10
,等等。这可以按预期工作。我已经注册了JAX-RS ExceptionMapper,它将映射javax.validation.ConstraintViolationException
到正确的HTTP响应。我将通过一个示例来解释“数据完整性验证”的确切含义。当两个或多个资源之间存在关系时,会发生这种情况。想象两个资源:a Product
和a
Category
。A Product
有 个Category
。当客户端将要Product
创建的表示发送到服务器(POST
HTTP请求)时,它必须通知Category
产品。当然,客户必须事先知道类别。想象一下JSON:
{
"quantity": "10",
"state": "PRODUCED",
"category": {
"id": "123"
}
}
好吧,ID类别123
可能不存在。如果我们尝试将其插入数据库,显然会得到与外键相关的异常。因此,我认为我们必须验证这些问题并向客户端返回正确的消息,就像常规的属性验证一样。
现在,我的主要问题是:
这些问题在某种程度上与Java有关,但我也希望对这些问题有一些新的认识。 一些技术独立的。:)如果您可以在REST
Web服务上为这些问题提供自己的解决方案,那就太好了。
该解决方案最终归为JacksonJaxbJsonProvider
实现了JAX-RS
MessageBodyReader
和的Jackson’s的子类MessageBodyWriter
。惊人的Dropwizard的方法使我受到启发。在此提供程序中,我们需要以某种方式注入Validator实例(我将Spring用于注入,将Hibernate
Validator用于JSR-303实现)。如果您使用Hibernate ORM,请不要忘记禁用实体验证,否则您将两次验证同一实体。不过,这可能是所需要的。
然后,在这个子类中MessageBodyReader
,我验证对象并抛出一个InvalidEntityException
来自验证器的错误的自定义。我还创建了一个JAX-
RS
ExceptionMapper<InvalidEntityException>
,该映射将每个映射InvalidEntityException
到正确的HTTP响应中。在我的情况下,我返回了错误请求和包含错误描述的JSON对象。
请注意,此MessageBodyReader会检查@Valid
和@Validated
注释。这意味着它正确支持组。这很重要,因为我们可能不想在整个应用程序中进行相同的验证。例如,当我们要进行部分更新(PUT)时。或者,例如,id属性在POST请求中必须为null,但在其他所有地方都不为null。
数据完整性验证尚未完全处理。但是我正计划捕获数据库异常并将它们转换为我自己的域异常(例如DataIntegrityException
),因为它看起来效率更高且与我无关。
更新:
从JAX-RS
2开始,推荐的方法是使用其Bean验证支持。在这里检查:https : //jersey.java.net/documentation/latest/bean-
validation.html
我正在使用Spring、Jersey和Hibernate(JPA)在Java中构建REST Web服务。 现在我试图在我的资源中添加对验证的支持。JSR-303(Bean验证)自然是一个合适的选择(我使用的是JSR-303的参考实现Hibernate验证器)。然而,我试图首先巩固一些概念。 在我看来,至少有两种可能的验证: 定期验证字段,例如检查属性是否为空,检查属性是否是有效的电子邮件,检查属性
我现在读了很多关于微服务的书,但仍然不了解其中的一些部分。我画了以下图: 每个微服务有2个访问: REST:对于超文本传输协议使用 gRPC:用于内部/后台通信/交换 如果我想登录,我可以向我的身份验证服务发送一个Http请求。但是,如果我想访问需要您连接的Stuff服务,该怎么办? 假设用户希望显示数据库中可用的内容,服务人员将首先通过与身份验证服务交换来检查连接用户的“令牌”是否正确,然后返回
问题内容: 我的公司拥有数千个现有的xml Web服务,并开始为新项目采用AngularJs。 http://angularjs.org/上的教程专门使用json服务。看起来他们在控制器中进行了服务调用,解析了生成的JSON,并将生成的对象直接传递给视图。 我该如何处理XML?我看到四个选项: 解析它,然后将DOM对象直接传递到UI(view)。 在服务器端围绕我的XML服务放置一个JSON包装器
当客户端请求资源服务器使用OAuth2.0访问令牌获取受保护的资源时,该服务器如何验证该令牌?OAuth 2.0刷新令牌协议?
默认情况下,vue-loader使用css-loader 和Vue模板编译器自动处理你的样式和模板文件。 在这个编译过程中,所有的资源URL,例如 img src="...", background:url(...)和CSS@import被解析为模块依赖。 例如,url(./ image.png)将被翻译为require('./ image.png')和 <img src="../image.pn
我是web服务新手,正在阅读Martin Kalin的《Java Webservices》一书。我已经了解了它最初的基本概念,有一个问题: 假设将HTTP请求(包含SOAP消息信封)发送到JavaWeb服务()。该请求是否由Servlet内部处理,Servlet提取SOAP消息并将其转换为相应Java域对象,然后调用服务实现bean? 无论Metro和Axis等现成框架如何,这个问题都是通用的。只