需求
对请求接口的参数进行校验
项目情况
springboot 2.1.0,引入spring-boot-starter-validation,(查找资料时,看到有文章说spring-boot-starter-web中包含了hibernate-validator,但是在我的项目中并不起作用,这个比较奇怪,但先不深究)
实现过程
1、项目引入spring-boot-starter-validation
2、全局异常拦截中增加以下方法
/**
* validation Exception
*
* @param exception e
* @return R
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.OK)
public R handleBodyValidException(MethodArgumentNotValidException exception) {
List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
StringBuilder message = new StringBuilder();
for (FieldError error : fieldErrors) {
message.append("字段:" + error.getField()).append(" ").append(error.getDefaultMessage()).append(",");
}
message = new StringBuilder(message.substring(0, message.length() - 1));
log.error("参数绑定异常,MethodArgumentNotValidException ,msg = {}", fieldErrors.get(0).getDefaultMessage());
return R.builder()
.errmsg(message.toString())
.errcode(HttpServletResponse.SC_BAD_REQUEST)
.build();
}
@ExceptionHandler(value = BindException.class)
@ResponseStatus(HttpStatus.OK)
public R handleBindException(BindException e) {
StringBuilder message = new StringBuilder();
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
for (FieldError error : fieldErrors) {
message.append(error.getField()).append(error.getDefaultMessage()).append(",");
}
message = new StringBuilder(message.substring(0, message.length() - 1));
log.error("请求参数类型错误,ex = {}", e.getMessage());
return R.fail(message.toString());
}
/**
* Hibenate validation Exception
*
* @param exception the e
* @return R
*/
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.OK)
public R handleConstraintViolationException(ConstraintViolationException exception) {
StringBuilder message = new StringBuilder();
Set<ConstraintViolation<?>> violations = exception.getConstraintViolations();
for (ConstraintViolation<?> violation : violations) {
Path path = violation.getPropertyPath();
String[] pathArr = StringUtils.splitByWholeSeparatorPreserveAllTokens(path.toString(), ".");
message.append(pathArr[1]).append(violation.getMessage()).append(",");
}
message = new StringBuilder(message.substring(0, message.length() - 1));
log.error("参数验证异常,ConstraintViolationException,msg = {}", message.toString());
return R.builder()
.errmsg(message.toString())
.errcode(ResultCode.PARAM_VALID_ERROR.getCode())
.build();
}
3、使用示例
1)json格式的参数,在bean前面加上@Valid:
public void XXX(@RequestBody @Valid XXXDTO dto) {
//
}
//相应的bean里面的参数
@NotNull(message = "不能为空")
private Long questionnaireId;
2)form表单方式的参数,注意需要在该方法的类上面注解
@Validated
public class XXXController {
public void del(@RequestParam("id") @NotNull(message = "不能为空") Long id) {
//
}
}
总结
总体来说使用还是比较方便的,网上资料也很多,自己遇到的坑是,项目里已经有spring-boot-starter-web,但是还是需要单独引包,不引入则不起作用