zuul 自定义异常处理

不念不忘少年蓝@ 2022-05-29 06:53 435阅读 0赞

两种方式
1.自定义error错误页面

  1. /**
  2. * 自定义error错误页面
  3. * @author zhiguang
  4. */
  5. @RestController
  6. public class ErrorHandlerController implements ErrorController {
  7. /**
  8. * 出异常后进入该方法,交由下面的方法处理
  9. */
  10. @Override
  11. public String getErrorPath() {
  12. return "/error";
  13. }
  14. @RequestMapping("/error")
  15. public Object error(){
  16. RequestContext ctx = RequestContext.getCurrentContext();
  17. ZuulException exception = (ZuulException)ctx.getThrowable();
  18. return Result.choose(exception.nStatusCode, exception.getMessage());
  19. }
  20. }

我这里是返回的json信息

2.禁用zuul默认的异常处理filter—-SendErrorFilter
在yml中设置
zuul:
SendErrorFilter:
error:
disable:true

然后自定义errorfilter

  1. public class ErrorFilter extends ZuulFilter {
  2. private static final Logger logger = LoggerFactory.getLogger(ErrorFilter.class);
  3. @Override
  4. public String filterType() {
  5. return "error";
  6. }
  7. @Override
  8. public int filterOrder() {
  9. return 0;
  10. }
  11. @Override
  12. public boolean shouldFilter() {
  13. return true;
  14. }
  15. @Override
  16. public Object run() throws ZuulException {
  17. try {
  18. RequestContext context = RequestContext.getCurrentContext();
  19. ZuulException exception = this.findZuulException(context.getThrowable());
  20. logger.error("进入系统异常拦截", exception);
  21. HttpServletResponse response = context.getResponse();
  22. response.setContentType("application/json; charset=utf8");
  23. response.setStatus(exception.nStatusCode);
  24. PrintWriter writer = null;
  25. try {
  26. writer = response.getWriter();
  27. writer.print("{code:"+ exception.nStatusCode +",message:\""+ exception.getMessage() +"\"}");
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. } finally {
  31. if(writer!=null){
  32. writer.close();
  33. }
  34. }
  35. } catch (Exception var5) {
  36. ReflectionUtils.rethrowRuntimeException(var5);
  37. }
  38. return null;
  39. }
  40. ZuulException findZuulException(Throwable throwable) {
  41. if (ZuulRuntimeException.class.isInstance(throwable.getCause())) {
  42. return (ZuulException)throwable.getCause().getCause();
  43. } else if (ZuulException.class.isInstance(throwable.getCause())) {
  44. return (ZuulException)throwable.getCause();
  45. } else {
  46. return ZuulException.class.isInstance(throwable) ? (ZuulException)throwable : new ZuulException(throwable, 500, (String)null);
  47. }
  48. }
  49. }

可以看看SendErrorFilter这个类的源码,这是zuul的默认异常处理类

今天处理异常发现404不走过滤器

还是走的errorcontroller

  1. /**
  2. * 自定义error错误页面
  3. * @author zhiguang
  4. */
  5. @RestController
  6. public class ErrorHandlerController implements ErrorController {
  7. /**
  8. * 出异常后进入该方法,交由下面的方法处理
  9. */
  10. @Override
  11. public String getErrorPath() {
  12. return "/error";
  13. }
  14. @RequestMapping("/error")
  15. public Object error(HttpServletRequest request, HttpServletResponse response){
  16. //
  17. /*RequestContext ctx = RequestContext.getCurrentContext();
  18. ZuulException exception = (ZuulException)ctx.getThrowable();
  19. return Result.choose(exception.nStatusCode, exception.getMessage());*/
  20. Integer status = (Integer)request.getAttribute("javax.servlet.error.status_code");
  21. return Result.choose(status, status == 404 ? "访问地址不存在" : "内部服务器错误,正在处理");
  22. }
  23. }

可以查看BasicErrorController;类的源码

发表评论

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

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

相关阅读

    相关 zuul异常处理

    注意,关于怎样在zuul中处理异常,网上有很多方法,本文只讲述其中的一种。 首先,我们要知道以下几点: 1. zuul中有一个默认的处理异常的filter,名为 `Sen

    相关 Springboot定义异常处理

    背景 Springboot 默认把异常的处理集中到一个ModelAndView中了,但项目的实际过程中,这样做,并不能满足我们的要求。具体的自定义异常的处理,参看以下