Typically
@ExceptionHandler
,@InitBinder
, and@ModelAttribute
methods apply within the@Controller
class (or class hierarchy) in which they are declared. If you want such methods to apply more globally (across controllers), you can declare them in a class marked with@ControllerAdvice
or@RestControllerAdvice
目标实现:通过Bean Validation对Bean进行校验,如果检验不通过,把错误信息统一封装返回。
Controller 代码
@RestController
public class DemoController {
@GetMapping("/validate")
public String validate(@Valid User user) {
return "校验成功";
}
}
User代码
public class User {
@NotNull(message = "name不能为空")
private String name;
@Min(message = "不能小于10",value = 10)
private Integer age;
}
ControllerAdvice代码
@ControllerAdvice
public class GlobalErrorHandler {
@ExceptionHandler(BindException.class)
@ResponseBody
BaseResponse handleControllerException(HttpServletRequest request, Throwable ex) {
BaseResponse baseResponse = new BaseResponse();
if (ex instanceof BindException) {
BindException bindException = BindException.class.cast(ex);
List<ObjectError> errors = bindException.getBindingResult().getAllErrors();
baseResponse.setCode(400);
baseResponse.setMsg("参数错误:" + errors.get(0).getDefaultMessage());
}
return baseResponse;
}
}
注意:Bean Validation校验不通过会抛出BindException异常,通过@ExceptionHandler 拦截此异常。
BaseResponse代码
public class BaseResponse<T> {
private int code;
private String msg;
private T data;
}
效果
{
"code": 400,
"msg": "参数错误:name不能为空",
"data": null
}