1 背景
服务端的接口经常要进行参数校验,传统的在方法里面校验的方式会产生很多冗余代码,因此可以使用一些工具来帮我们解决这个问题
例如 hibernate-validator
引入jar包
- hibernate-validator.6.5.0.Final.jar
- validation-api-1.0.0.GA.jar
使用如下
- 在需要校验的参数对象上加上约束注解
- 在controller 方法里面加上 @Valid ,使校验生效
@ApiModelpublic class UserCreateRequest { @ApiModelProperty(name = "手机验证码") @NotBlank private String code; @ApiModelProperty(name = "手机号") @NotBlank private String phone; private String username; @ApiModelProperty(name = "密码") @NotBlank private String password;}@ApiOperation(value = "检验")@PostMapping(value = "/check")public String create(@RequestBody @Valid UserCreateRequest request) { return null;}
2 去掉 BindingResult
经过上面的配置,如果请求的参数校验不通过,返回的信息是这样的,这些信息没有经过整理,对前端来说很难处理 因此我们要重新整理这 些校验不通过的提示信息
通用的有一种方式,就是方法里面加上 BindingResult 参数,校验结果会存放到这个参数里面, 然后拿到异常信息返回
@ApiOperation(value = "检验")@PostMapping(value = "/check")public String create(@RequestBody @Valid UserCreateRequest request, BindingResult bindingResult) { if (bindingResult.hasErrors()){ return bindingResult.getFieldError().getDefaultMessage(); } return null;}
尼玛这么写代码,得在每个校验的方法里面加上这个,很不爽,看我的。
异常处理机制要这么配置
@Componentpublic class CustomExceptionResolver implements HandlerExceptionResolver, Ordered { private static final Log log = LogFactory.getLog(CustomExceptionResolver.class); @Override public int getOrder() { return 0; } // 这里将捕获到的异常做统一处理,不直接在接口返回异常的堆栈信息 @ResponseBody @Nullable @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) { log.error("捕获到异常