千家信息网

@valid无法触发BindingResult怎么解决

发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,这篇文章主要介绍"@valid无法触发BindingResult怎么解决",在日常操作中,相信很多人在@valid无法触发BindingResult怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简
千家信息网最后更新 2025年11月12日@valid无法触发BindingResult怎么解决

这篇文章主要介绍"@valid无法触发BindingResult怎么解决",在日常操作中,相信很多人在@valid无法触发BindingResult怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"@valid无法触发BindingResult怎么解决"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

方法参数

public String listFireEvent(@Valid  FireSearch fireSearch, HttpServletRequest request, BindingResult bindingResult)

问题

如果验证失败会直接抛出异常,而不是放入bindingResult

原因

@Valid 和 BindingResult 不能有其它类

解决方案

把HttpServletRequest 放到最后

即:

public String listFireEvent(@Valid FireSearch fireSearch, BindingResult bindingResult,HttpServletRequest request)

@Validated和@Valid区别

Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated

Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。其中对于字段的特定验证注解比如@NotNull等网上到处都有,这里不详述

在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同:

1. 分组

  • @Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。@Valid:作为标准JSR-303规范,还没有吸收分组的功能。

2. 注解地方

  • @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上

  • @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。

3. 嵌套验证

在比较两者嵌套验证时,先说明下什么叫做嵌套验证。比如我们现在有个实体叫做Item:

public class Item {    @NotNull(message = "id不能为空")    @Min(value = 1, message = "id必须为正整数")    private Long id;    @NotNull(message = "props不能为空")    @Size(min = 1, message = "至少要有一个属性")    private List props;}

Item带有很多属性,属性里面有属性id,属性值id,属性名和属性值,如下所示:

public class Prop {    @NotNull(message = "pid不能为空")    @Min(value = 1, message = "pid必须为正整数")    private Long pid;    @NotNull(message = "vid不能为空")    @Min(value = 1, message = "vid必须为正整数")    private Long vid;    @NotBlank(message = "pidName不能为空")    private String pidName;    @NotBlank(message = "vidName不能为空")    private String vidName;}

属性这个实体也有自己的验证机制,比如属性和属性值id不能为空,属性名和属性值不能为空等。

现在我们有个ItemController接受一个Item的入参,想要对Item进行验证,如下所示:

@RestControllerpublic class ItemController {    @RequestMapping("/item/add")    public void addItem(@Validated Item item, BindingResult bindingResult) {        doSomething();    }}

如上,如果Item实体的props属性不额外加注释,只有@NotNull和@Size,无论入参采用@Validated还是@Valid验证,Spring Validation框架只会对Item的id和props做非空和数量验证,不会对props字段里的Prop实体进行字段验证,也就是@Validated和@Valid加在方法参数前,都不会自动对参数进行嵌套验证。也就是说如果传的List中有Prop的pid为空或者是负数,入参验证不会检测出来。

为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证。由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。

我们修改Item类如下所示:

public class Item {    @NotNull(message = "id不能为空")    @Min(value = 1, message = "id必须为正整数")    private Long id;    @Valid // 嵌套验证必须用@Valid    @NotNull(message = "props不能为空")    @Size(min = 1, message = "props至少要有一个自定义属性")    private List props;}

然后我们在ItemController的addItem函数上再使用@Validated或者@Valid,就能对Item的入参进行嵌套验证。此时Item里面的props如果含有Prop的相应字段为空的情况,Spring Validation框架就会检测出来,bindingResult就会记录相应的错误。

总结一下@Validated和@Valid在嵌套验证功能上的区别:

  • @Validated:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

  • @Valid:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

到此,关于"@valid无法触发BindingResult怎么解决"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

验证 属性 字段 方法 功能 参数 实体 成员 框架 注解 分组 整数 学习 不同 机制 标准 也就是 函数 地方 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 安卓计步软件开发难点 软件开发中作业池是什么意思 网络安全手抄报怎么做二年级 工业网络安全法 边锋网络技术有限公司 人数 远程无法访问服务器管理端口 计算机网络技术云计算运维与开发 网络安全的句子有哪些20字 软件开发行业前景如何 永川区一站式软件开发流程特点 四级英语单词软件开发 专家解读网络安全法ppt 服务器上怎么架设游戏 套接字服务器已运行什么意思 山西云手机服务器租用 服务器可以多人远程吗 什么属于软件开发服务 网络安全的职业兴趣是什么 华为无线部门网关软件开发 sql中如何插入学生课程数据库 虚拟仿真教学软件开发流程 电力监推系统网络安全招标山东 信息网络技术干什么 软件开发工程师的职业生活 翻墙服务器搭建 组装高性价比双cpu服务器 华互互联网科技 安全接入区采集服务器作用 为什么软件开发门槛 锐讯网络技术团队
0