[Spring MVC]BindingResult

一.什么是BindingResult

BindingResult 接口用于处理数据绑定的错误和验证错误。

当用户提交表单时,Spring 会将请求中的表单数据绑定到 @参数校验注解注解指定的对象上。

如果在绑定过程中发生错误(如数据格式不正确、必填字段为空等),这些错误会被记录在 BindingResult 对象中。

BindingResult 提供了多种方法来查看、处理和报告这些错误,最常见的方法是 hasErrors()、getFieldErrors()、getGlobalErrors() 等。

通过这些方法,开发者可以在视图层向用户展示相应的错误信息,提升用户体验。

二.核心方法

所有方法均围绕 **"判断是否有错误"+"获取错误信息"** 展开,适配你图中通过校验的核心判定需求,按使用优先级排序,简单易上手:

2.1. 核心判定方法:hasErrors()

  • 作用 :判断参数校验是否存在错误,是你图中通过校验的核心判定依据
  • 返回值 :boolean(false= 无错误,执行你图的通过校验;true= 有错误,拦截并处理)
  • 使用场景 :Controller 层参数校验的第一个判断步骤,必用!

java

运行

复制代码
// 你图中Controller层的核心判定逻辑
if(bindingResult.hasErrors()){
    // 有错误:封装错误信息,直接返回前端,不进Model层
    return Result.fail(400, "参数校验失败");
}
// 无错误:执行你图的「通过校验」,传递DTO至Model层
userService.handle(dto);

2.2. 核心获取错误方法:getFieldErrors()

  • 作用 :获取所有字段的校验错误,返回封装好的错误列表,包含「错误字段名 + 自定义提示信息」
  • 返回值 :List<FieldError>(每个 FieldError 对应一个字段的错误)
  • 使用场景 :校验失败时,批量获取所有字段错误,拼接后返回前端,适配多字段校验的场景

java

运行

复制代码
if(bindingResult.hasErrors()){
    // 拼接所有字段的错误信息:如「username:用户名不能为空;phone:手机号格式错误」
    String errorMsg = bindingResult.getFieldErrors().stream()
        .map(e -> e.getField() + ":" + e.getDefaultMessage())
        .collect(Collectors.joining(";"));
    return Result.fail(400, errorMsg);
}

2.3. 精准获取错误方法:getFieldError(String fieldName)

  • 作用 :根据指定字段名,精准获取单个字段的校验错误(适用于需要单独处理某个字段错误的场景)
  • 参数 :fieldName(DTO 中的字段名,如username/phone)
  • 返回值 :FieldError(单个字段的错误对象,无错误则返回null)
  • 使用场景:对核心字段做单独错误提示,如登录场景单独提示 "密码错误"

java

运行

复制代码
if(bindingResult.hasErrors()){
    // 仅获取password字段的错误
    FieldError pwdError = bindingResult.getFieldError("password");
    if(pwdError != null){
        return Result.fail(400, pwdError.getDefaultMessage());
    }
    return Result.fail(400, "参数错误");
}

2.4. 快速获取提示方法:getDefaultMessage()(FieldError 的配套方法)

  • 作用 :从FieldError对象中,获取注解中自定义的 message 提示(如 @NotBlank (message = "用户名不能为空") 的文字)
  • 使用场景 :配合getFieldErrors()/getFieldError()使用,是获取错误提示的最终方法

2.5. 全局错误方法:getGlobalErrors()

  • 作用 :获取非字段级的全局校验错误(极少用,一般不推荐)
  • 适用场景:仅当使用全局校验注解(非字段注解)时才会用到,日常开发中几乎不用,了解即可。

code:

复制代码
if (bindingResult.hasErrors()) {
    String errorMessage = bindingResult.getFieldErrors().stream()
            .map(fi -> fi.getField() + ":" + fi.getDefaultMessage())
            .collect(Collectors.joining(","));
    return Result.fail(errorMessage);
}
相关推荐
3095566662 分钟前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
nice_lcj5205 分钟前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
文丑颜不良啊21 分钟前
LeetCode2861~2880题目解析
java·leetcode
装不满的克莱因瓶32 分钟前
设计模式之策略模式核心概念和应用场景
java·后端·设计模式·架构·系统架构·策略模式
晴天的雨.99237 分钟前
【C++】继承篇
java·开发语言·c++
SomeOtherTime43 分钟前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
qq_406981031 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
头发还在的女程序员1 小时前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件
FYKJ_20101 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
Flynn Liang1 小时前
LLM 应用安全:Prompt 注入、越权与输入输出护栏
java·人工智能·大模型·langchain4j·llm 安全·prompt 注入·guardrail