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

2024-02-19

在 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 适用于 JavaBean 上的验证。 Ajava.util.List不是 JavaBean(根据官方说明 https://docs.oracle.com/javaee/5/tutorial/doc/bnair.htmlJavaBean 的),因此不能直接使用符合 JSR-303 的验证器进行验证。这得到了两个观察结果的支持。

Section 3.1.3 of the JSR-303规格 https://beanvalidation.org/1.0/spec/#d0e991说:

除了支持实例验证之外,还支持对象图的验证。图验证的结果作为一组统一的约束违规返回。考虑以下情况:bean X 包含类型 Y 的字段. By 使用@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 实现

I have 示例应用程序 https://github.com/manish-in-java/stackoverflow-questions/tree/master/17207766使用 Hibernate Validator 和 Apache Beans Validator 测试集合验证。如果您对此示例运行测试mvn clean test -Phibernate(使用 Hibernate 验证器)和mvn clean test -Papache(对于 Beans Validator),两者都拒绝直接验证集合,这似乎符合规范。由于 Hibernate Validator 是 JSR-303 的参考实现,因此该示例进一步证明集合需要封装在 bean 中才能进行验证。


清除了这一点后,我想说,尝试以问题中所示的方式直接将集合传递给控制器​​方法也存在设计问题。即使验证直接在集合上工作,控制器方法也无法使用不直接映射到集合的替代数据表示形式,例如自定义 XML、SOAP、ATOM、EDI、Google Protocol Buffers 等。为了支持这些表示,控制器必须接受并返回对象实例。这需要以任何方式将集合封装在对象实例内。因此,强烈建议将List正如其他答案所建议的那样,在另一个对象内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring MVC - REST 服务中的 bean 列表上的 @Valid 的相关文章

  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 如何在字段值无效的情况下更改 Struts2 验证错误消息?

    我在 Web 表单上使用 Struts2 验证 如果字段假设为整数或日期 则
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 如何在 Spring 3.1 中构造函数自动装配 HttpServletResponse?

    我有一个请求范围的 bean 并且需要访问 HttpServletResponse 和 HttpServletRequest 对象 我需要在构造函数中访问这些对象 因此属性自动装配不是一个选项 我做了以下事情 Component Scope
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • Spring Boot中ServletContext初始化后如何创建bean?

    我有一个 bean 它实现 ServletContextAware 和 BeanFactoryPostProcessor 接口 我需要在 ServletContext 完成初始化后将此 bean 注册到 applicationContext
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也

随机推荐

  • 在 SQL Server 数据库中自动添加对象及其关系

    假设我想插入一个新的Experiment在我的 SQL Server 数据库中 使用实体框架 4 0 Experiment有 1 Tasks in it Both Experiment and Task从获得EntityObject 此外
  • Javascript 数据表中的自动换行列数据

    我有一个 JS 数据表 我们在其中输入客户信息 在某些情况下 一些客户参考是这样的 reference text 26reference 5Ftext 3D 2526reference 255Ftext 253Dtest 252520ips
  • AudioKit v4.2 上的 AKRhodesPiano 错误(粉碎)

    我在用着AudioKit 版本 4 2 https github com AudioKit AudioKit releases tag v4 2在我的手机 iPhone X 上安装我的应用程序后 我收到此错误 参见附图 使用 AKRhode
  • 如何获取 SQL 中具有 MAX 和 MIN 值的行的 ID

    我正在努力使我的网站使用的查询更加高效 由于对 SQL 有点模糊 我还没有真正学会如何使用嵌套查询 但我刚刚设法得到了一些非常接近我想要的东西 我销售吉他 我有一个大数据库 其中单独列出了具有不同饰面选项的所有产品 项目在 dB 中具有唯一
  • oracle多用户功能

    如何创建可供不同用户使用的功能 它必须像内置的 oracle 函数一样工作 可以从任何用户调用 我想这可以通过授予一些特权来实现 这应该为特定用户执行此操作 GRANT EXECUTE ON your function TO some us
  • 如何将包含冒号的 GET 请求发送到 ASP.NET MVC2 控制器?

    这工作正常 GET mvc Movies TitleIncludes Lara 20Croft 当我提交包含冒号的请求时 如下所示 GET mvc Movies TitleIncludes Lara 20Croft 20Tomb 它会生成
  • 如何在Android Studio中更改项目名称

    将 eclipse 项目导入 Android Studio 并将其保存在新文件夹中 将包名称和所有内容更改为新名称 但项目名称仍然是旧项目中的名称 如何将指向的名称更改为其他名称 尝试更改此文件的内容 C Path To Project i
  • EnterCriticalSection 死锁

    多线程日志记录应用程序出现死锁情况 小背景 我的主应用程序有 4 6 个线程正在运行 主线程负责监视我正在做的各种事情的运行状况 更新 GUI 等 然后我有一个传输线程和一个接收线程 发送和接收线程与物理硬件通信 我有时需要调试发送和接收线
  • 如何使用向量通过指针引用递归结构

    我有结构 我们称它们为 sn 看起来像 struct sn string name vector
  • 无法确定包装器版本

    我创建了一个反应本机应用程序 只需执行以下操作 react native init app 我已经按照这个教程进行操作 Facebook 入门 我使用 Linux https facebook github io react native
  • 如何使用 SciPy 插值 3D 数据时提高性能

    我有代表大气的 3D 数据 现在我想将此数据插值到一个公共 Z 坐标 我的意思应该从函数的文档中清楚地看出 下面的代码工作正常 但我想知道是否有办法提高性能 def interpLevel grid value data interp li
  • Angular Firestore:使用 where 子句的集合查询的正确语法是什么?

    我有查询 Firestore 并返回 Observable 类型的工作代码ImageUploadWId 我想退货Promise反而 这是因为 我的数据不经常变化 我正在根据传入的数据执行删除 SnapshotChanges 返回操作数组 第
  • 在 Bootstrap 4 中显示/隐藏 div,同时调整传单地图的高度

    我正在构建一个 Web 应用程序 屏幕上有 3 个组件 导航栏 置顶 主容器地图容器 主要的 75 聊天窗口 主窗口的 25 我想要做的是隐藏聊天页脚 然后让地图容器占据所有主容器 但如果用户想查看聊天窗口 他单击一个按钮 地图就会缩小到窗
  • 始终获得“None”的打印值

    好吧 这是我的代码 我得到了我想要的结果 但我不断得到它下面的 无 值 如何消除 无 值 n input What day of the week are you leaving r input How many days will you
  • 从 CLI 查询 InfluxDB 时显示本地时区的时间

    我使用 UTC 将点存储在 InfluxDB 中 但是从命令行 https docs influxdata com influxdb v1 6 tools shell influx precision rfc3339 我想在所有查询中以本地
  • LendingClub.com API 在二级市场购买票据时发生内部服务器错误

    我正在尝试购买 Lending Club 二级市场的票据 但一直收到 内部服务器错误 我也多次向Lending Club寻求支持 但他们毫无头绪 我也尝试关注这篇文章 但没有运气LendingClub com 在二级市场购买票据时出现 AP
  • 实体框架通用存储库错误

    我正在尝试为我的实体框架存储库创建一个非常通用的泛型存储库 它具有基本的 CRUD 语句并使用接口 我的头先撞到了砖墙 然后被撞倒了 这是我的代码 使用实体框架模型在控制台应用程序中编写 并带有一个名为 Hurl 的表 只是试图通过对象的
  • Python:Urllib.urlopen 非数字端口

    对于以下代码 theurl https s email protected cdn cgi l email protection nic update hostname s myip s wildcard NOCHG mx NOCHG ba
  • 更改已编译类中的字符串常量

    我需要更改已部署的Java程序中的字符串常量 即编译后的值 class 文件 它可以重新启动 但不容易重新编译 尽管如果这个问题没有答案 这是一个不方便的选择 这可能吗 更新 我刚刚用十六进制编辑器查看了该文件 看起来我可以轻松更改那里的字
  • Spring MVC - REST 服务中的 bean 列表上的 @Valid

    在 Spring MVC REST 服务 json 中 我有一个像这样的控制器方法 RequestMapping method RequestMethod POST value doesntmatter ResponseBody publi