当前位置: 首页 > 面试题库 >

Spring MVC-REST服务中的bean列表上的@Valid

柳星晖
2023-03-14
问题内容

在Spring MVC REST服务(json)中,我有一个像这样的控制器方法:

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {

MyBean类具有bean验证批注的位置。

尽管在其他控制器上效果很好,但似乎没有在这种情况下进行验证。

我不想将列表封装在dto中,这会改变json输入。

为什么没有对bean列表的验证?有哪些选择?


问题答案:

@Valid是JSR-303批注,JSR-303适用于JavaBeans上的验证。A
java.util.List不是JavaBean(根据JavaBean的官方描述),因此不能使用兼容JSR-303的验证器直接对其进行验证。这有两个观察结果支持。

3.1.3 中的JSR-303规范说:

除了支持实例验证之外,还支持对象图的验证。 图形验证的结果作为一组统一的约束违规返回。考虑以下情况: bean X包含类型Y的字段 。通过
使用@Valid注释字段Y进行注释当X被验证时 ,验证器 将验证Y(及其属性)
。在运行时确定类型Y声明的字段(子类,实现)中包含的值的确切类型Z。使用Z的约束定义。这样可以确保标记为@Valid的关联具有正确的多态行为。

集合值,数组值和 通常可 迭代的字段和属性也可以使用@Valid注释修饰
。这将使迭代器的内容得到验证。支持任何实现java.lang.Iterable的对象。

我已经用粗体标记了重要的信息。本节意味着,为了验证集合类型,必须将其封装在Bean中(由表示Consider the situation where bean X contains a field of type Y);此外,集合不能直接验证(由表示Collection-valued, array- valued and generally Iterable fields and properties may also be decorated,重点是
字段和属性 )。

实际的JSR-303实现

我有一个示例应用程序,它使用Hibernate Validator和Apache Beans
Validator来测试集合验证。如果以mvn clean test -Phibernate(使用Hibernate Validator)和mvn clean test -Papache(用于Beans
Validator)对此示例运行测试,则两者都拒绝直接验证集合,这似乎与规范相符。由于Hibernate
Validator是JSR-303的参考实现,因此该示例进一步证明了必须将集合封装在Bean中才能进行验证。

清除这些内容后,我想说还有一个设计问题,即试图以问题中所示的方式将集合直接传递给控制器​​方法。即使验证直接在集合上进行,控制器方法也将无法使用其他不能直接映射到集合的数据表示形式,例如自定义XML,SOAP,ATOM,EDI,Google协议缓冲区等。为了支持这些表示,控制器必须接受并返回对象实例。那将需要以任何方式将集合封装在对象实例内。因此,List如其他答案所建议的那样,最好将另一个对象包装在内部。



 类似资料:
  • 在Spring MVC REST服务(json)中,我有一个控制器方法,如下所示: 其中MyBean类具有bean验证注释。 在这种情况下,验证似乎没有发生,尽管它对其他控制器很有效。 我不想将列表封装在dto中,这样会改变json输入。 为什么没有对bean列表的验证?有哪些替代方案?

  • 谢谢你的帮助!向你问好,安迪

  • 问题内容: 有谁知道如何在RESTful Web服务中编写POST方法以使用Java上传数据?我发现smartupload和commons.upload仅用于网页。 问题答案: 您可以使用一些JAX-RS库,例如Apache Wink,因此可以编写如下代码: 这样您将收到文件是。您还可以作为InputStream接收:

  • 我编写了两个简单的函数GET和POST,用于从表单中使用数据。不幸的是,当我提交此表单时,会再次显示带有空字段的表单,而不是获取响应。它更改URL地址http://localhost:8080/example到http://localhost:8080/example/?version=5.4

  • 假设我们有一个用户、Wallet REST微服务和一个将事情粘合在一起的API网关。当Bob在我们的网站注册时,我们的API网关需要通过用户微服务创建一个用户,通过钱包微服务创建一个钱包。 下面是一些可能出错的场景: > 用户Bob创建失败:没关系,我们只需向Bob返回一个错误消息。我们使用的是SQL事务,所以没有人在系统中看到Bob。一切都很好:) 创建了用户Bob,但在创建钱包之前,我们的AP

  • 我需要将基于soap的应用程序转换为基于rest的quarkus应用程序。 我需要一个quarkusRest服务采取以下请求和产生响应。