Springboot实现自定义全局参数校验异常

应用场景:

在实际开发中,经常还需要在后端对前端传递的参数进行参数校验,在校验失败后封装成统一的结果集进行返回。但是如果一个前端穿过的参数类需要校验的参数过多代码就会十分臃肿,所以可以用到spring-boot-starter-validation框架搭配上自己项目定义的统一结果集去进行参数校验处理。

实际应用:

1. 项目自定义的统一返回结果集

/**
 * @author warmwind
 * @since 2024-05-29 下午2:57
 */
public class ApiResult<T> implements Serializable {

    /**
     * 序列化id
     */
    private static final long serialVersionUID = 1L;

    /**
     * 响应码
     */
    private Integer code;

    /**
     * 响应状态信息
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 响应错误信息
     */
    private String error;
	
	// 省略getter和setter以及构造方法
}

2. 配置全局的参数异常处理器

/**
 * 参数校验拦截器
 *
 * @author warmwind
 * @since 2024-06-29 下午5:53
 */
@ControllerAdvice
public class ParamValidationHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ApiResult<?>> handleValidationException(MethodArgumentNotValidException exception) {
        String message = exception.getBindingResult().getFieldError().getDefaultMessage();
        ApiResult<?> apiResult = new ApiResult<>()
                .setCode(HttpStatus.FAILURE_CODE)
                .setMessage(message);
        return ResponseEntity.badRequest().body(apiResult);
    }
}

注: 这里的HttpStatus是自定义的响应状态常量

3. 配置快速失败模式

/**
 * 快速失败模式
 *
 * @author warmwind
 * @since 2024-06-30 上午12:34
 */
@Configuration
public class ValidationConfig {

    @Bean
    public Validator validator(AutowireCapableBeanFactory springFactory) {
        ValidatorFactory factory = Validation.byProvider(HibernateValidator.class)
                .configure()
                .failFast(true)
                .constraintValidatorFactory(new SpringConstraintValidatorFactory(springFactory))
                .buildValidatorFactory();
        return factory.getValidator();
    }
}

快速失败模式有两点用处,一是为了防止过度校验,二是如果有多条校验失败的消息,就会放到一个异常信息数组里;在全局异常处理的时候拿到的是数组,如果直接返回前端的异常信息不经过处理打印到页面提示信息会影响用户体验,所以如果没有特殊要求可以配置特殊失败模式

4. 直接使用

/**
 * @author warmwind
 * @since 2024-06-30 上午12:48
 */
@Data
public class TestParam {

    private String username;

    @NotBlank(message = "密码不能为空")
    private String password;
}
/**
 * @author warmwind
 * @since 2024-06-30 上午12:46
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @PostMapping("/test01")
    public ApiResult<?> test01(@RequestBody @Validated TestParam testParam) {
        return new ApiResult<>().setCode(HttpStatus.SUCCESS_CODE).setMessage("success!!!");
    }
}

5. 使用postman测试

正常请求
在这里插入图片描述
异常请求
在这里插入图片描述

ps: 萌新一枚,个人想法,欢迎各位大佬指正

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值