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: 萌新一枚,个人想法,欢迎各位大佬指正