SpringBoot项目中优雅处理参数校验失败信息

博客介绍了Spring Boot项目中对前端请求参数进行校验常用的注解,如@NotBlank、@NotNull、@Valid等。还探讨了如何将注解提示信息返回给前端,以及当多个校验未通过时,如何实现有校验失败就结束返回,最终实现返回具体校验参数给前端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在springboot项目中对前端请求的参数进行校验常用的注解:
@NotBlank,@NotNull,@Valid
示例:

public class UserRequest {
    @NotNull(message = "id不能为空")
    private long id;
 
    @NotBlank(message = "名字不能为空")
    @Length(min = 1, max = 50, message = "名字名称长度不能大于50")
    @Pattern(regexp ="[0-9A-Z_\\-]+", message = "名字只能为数字和大写字母组合")
    private String name;
  
	//省略get/set方法
    }

要使参数校验生效要注意其方法使用@Valid注解标注实体,如:

    @PostMapping("/update")
    public MyResponse updateRequest(@Valid @RequestBody UserRequest  request) {
	//业务逻辑xxx  
    return MyResponse.ok();
    }

当请求中name字段为空,系统会返回系统定义默认的异常,并没有返回注解上打印的提示信息
在这里插入图片描述
那如果将注解上对应的提示信息进行返回给前端呢?

**
 * 参数校验 异常捕捉处理类
 */
@ControllerAdvice
public class WebExceptionHandler {
 
    /**
     * 请求参数格式错误 @RequestBody上valid失败后抛出的异常是MethodArgumentNotValidException异常;我们可以根据不同的异常类在系统中进行配置拦截处理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public MyResponse MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
       MyResponse re = new MyResponse();
       re.setCode("500");
       re.setMsg(message);
       return re;
    }
 }

在调用更新接口查看返回结果:
在这里插入图片描述
可以发现接口确实把校验为通过的请求返回了,但是如果这个参数多个校验都没有通过,接口会校验提示的信息都返回,那如何只要有校验失败了,就结束返回呢?

添加一个配置类

package com.test;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import javax.validation.*;

/**
 * 通过这个配置改成校验参数时只要出现校验失败的情况,就立即抛出对应的异常,结束校验,不再进行后续的校验
 */
@Configuration
public class WebConfig {

    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                //failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。
                .failFast(true)
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
        methodValidationPostProcessor.setValidator(validator());
        return methodValidationPostProcessor;
    }

}

在调用更新接口,接口返回如下:
在这里插入图片描述
这样就可以返回一个具体校验的参数给前端。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值