使用@ControllerAdvice如何返回给前端对应错误码

水深无声 2022-03-02 11:30 469阅读 0赞

@ControllerAdvice可以捕获spring应用下面未被捕获异常,下面是常见代码:

  1. @ExceptionHandler(value = Exception.class)
  2. @**ResponseStatus**(HttpStatus.INTERNAL\_SERVER\_ERROR)
  3. public String errorHandler(Exception ex) \{
  4. ApiResultVo<String> resultVo = new ApiResultVo<>();
  5. resultVo.setErrorCode(500);
  6. resultVo.setErrorMsg(ex.getMessage());
  7. return JSON.toJSONString(resultVo);
  8. \}
  9. @ExceptionHandler(value = MyException.class)
  10. @**ResponseStatus**(HttpStatus.INTERNAL\_SERVER\_ERROR)
  11. public String myExceptionHandler(MyException ex) \{
  12. ApiResultVo<String> resultVo = new ApiResultVo<>();
  13. resultVo.setErrorCode(401);
  14. resultVo.setErrorMsg(ex.getMessage());
  15. return JSON.toJSONString(resultVo);
  16. \}

我们在对应异常处理的上面加上ResponseStatus注解就能将系统异常转换为对应的Http状态码,这部分工作由ResponseStatusExceptionResolver这个类完成,下面是关键代码:

  1. protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response,
  2. Object handler, Exception ex) \{
  3. ResponseStatus responseStatus = AnnotatedElementUtils.findMergedAnnotation(ex.getClass(), ResponseStatus.class);
  4. if (responseStatus != null) \{
  5. try \{
  6. return **resolveResponseStatus**(responseStatus, request, response, handler, ex);
  7. \}
  8. catch (Exception resolveEx) \{
  9. logger.warn("Handling of @ResponseStatus resulted in Exception", resolveEx);
  10. \}
  11. \}
  12. else if (ex.getCause() instanceof Exception) \{
  13. ex = (Exception) ex.getCause();
  14. return doResolveException(request, response, handler, ex);
  15. \}
  16. return null;
  17. \}
  18. protected ModelAndView **resolveResponseStatus**(ResponseStatus responseStatus, HttpServletRequest request,
  19. HttpServletResponse response, Object handler, Exception ex) throws Exception \{
  20. int statusCode = responseStatus.code().value();
  21. String reason = responseStatus.reason();
  22. if (!StringUtils.hasLength(reason)) \{
  23. **response.sendError**(statusCode);
  24. \}
  25. else \{
  26. String resolvedReason = (this.messageSource != null ?
  27. this.messageSource.getMessage(reason, null, reason, LocaleContextHolder.getLocale()) :
  28. reason);
  29. response.sendError(statusCode, resolvedReason);
  30. \}
  31. return new ModelAndView();
  32. \}

发表评论

表情:
评论列表 (有 0 条评论,469人围观)

还没有评论,来说两句吧...

相关阅读