1、ErrorController 应用
(1)实现ErrorController类。
ErrorController实现的MethodInterceptor拦截器。
可以自己定义一个新的 ErrorController
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class FundaErrorController implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping
@ResponseBody
public Result doHandleError() {
return new Result(ResultCode.WEAK_NET_WORK);
}
}
@RequestMapping("${server.error.path:${error.path:/error}}")
public class FundaErrorController implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping
@ResponseBody
public Result doHandleError() {
return new Result(ResultCode.WEAK_NET_WORK);
}
}
当我们再次访问该接口的时候会返回:
{
"code": -1,
"msg": "网络异常,请稍后重试",
"data": null
}
"code": -1,
"msg": "网络异常,请稍后重试",
"data": null
}
(1)直接在对应的 Controller 里面增加一个异常处理的方法,并使用 @ExceptionHandler 标识它即可。
@ExceptionHandler(Exception.class)
public Result handleException() {
return new Result(ResultCode.WEAK_NET_WORK);
}
(2)
项目的往往存在着多个 Controller,而它们在异常处理方面有存在着很多的共性,这样就不太适合在每一个 Controller 里面都编写一个对应的异常处理方法。可以将异常处理方法向上挪移到父类中,然后所有的 Controller 统一继承父类即可。
定义父类 BaseController:
public class BaseController {
@ExceptionHandler(Exception.class)
public Result handleException(Exception e) {
e.printStackTrace();
return new Result(ResultCode.WEAK_NET_WORK);
}
}
UserController 通过继承 BaseController 完成异常处理:
@RestController
@RequestMapping("/sys/user")
public class UserController extends BaseController {
...
}
3、Advice 异常处理
对于使用父级 Controller 完成异常处理也有着它自己的缺点,那就是代码耦合严重,一旦哪天忘记继承 BaseController,异常又会直达客户了。想要解除这种耦合关系,可以使用 @ControllerAdvice 来协助处理。
@ControllerAdvice @ResponseBody public class ExceptionHandlerAdvice implements ResponseBodyAdvice { private ThreadLocal<Object> modelHolder = new ThreadLocal<>(); private Logger logger = LoggerFactory.getLogger(ExceptionHandlerAdvice.class); @ExceptionHandler(MethodArgumentNotValidException.class) public Result handleIllegalParamException(MethodArgumentNotValidException e) { List<ObjectError> errors = e.getBindingResult().getAllErrors(); String tips = "参数不合法"; if (errors.size() > 0) { tips = errors.get(0).getDefaultMessage(); } return ResultUtils.warn(ResultCode.PARAMETER_ERROR, tips); }
当应用程序抛出 MethodArgumentNotValidException 时,会精确匹配到该方法,在方法里面会获取到校验结果,并将所有校验错误中的第一条返回给前端应用。
这样的话,就可以在 ExceptionHandlerAdvice 里面添加各种各样的异常处理方法,以适合不同的应用场景。
项目的 github 地址:https://github.com/qchery/funda