mybatisplus报错:org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found. Available parameters are [arg1, arg0, param1, param2]
参数校验异常集中处理
@ControllerAdvice
public class WebExceptionHandler {
//处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常,详情继续往下看代码
@ExceptionHandler(BindException.class)
@ResponseBody
public Result BindExceptionHandler(BindException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return Result.build(ResultCode.PARAM_ERROR.getCode(),message);
}
//处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public Result ConstraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return Result.build(ResultCode.PARAM_ERROR.getCode(),message);
}
//处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return Result.build(ResultCode.PARAM_ERROR.getCode(),message);
}
//数据库唯一键重复异常捕获处理
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R handleSqlValidException(SQLIntegrityConstraintViolationException e) {
log.error("params illegal {}", e.getMessage());
//将错误信息返回给前台
return R.failed("params illegal");
}
}
总结:MethodArgumentNotValidException异常类对应处理@RequestBody上validate失败后抛出的异常;
ConstraintViolationException异常类对应处理@RequestParam上validate失败后抛出的异常;
SQLIntegrityConstraintViolationException对应处理数据库唯一键冲突异常;
补充
- controller层接收参数,如果使用json传参用bean接收需要添加@requestBody注解,否则bean属性值为null
- 在上述情况下只能只能用一个bean接收参数,因为controller层只能使用一个@RequestBody注解;如果需要使用多个bean接收参数,则使用key=value形式