当前位置: 首页 > news >正文

山西省大同市网站建设公司手机网页 模板

山西省大同市网站建设公司,手机网页 模板,织梦设置中英文网站,做网站去哪里Servlet的HttpResponse对象,返回响应报文,一般是这么写的,通过输出流直接就可以将返回报文输出。 OutputStream out response.getOutputStream(); out.write("输出的内容"); out.flush();在filter中如果发生异常(例如…

Servlet的HttpResponse对象,返回响应报文,一般是这么写的,通过输出流直接就可以将返回报文输出。

OutputStream out = response.getOutputStream();
out.write("输出的内容");
out.flush();

在filter中如果发生异常(例如请求参数不合法),抛出异常信息的时候,调用方收到的返回码和body都是Spring Cloud Gateway框架处理来处理的。这一节我们分析一下,gateway的异常返回报文是怎么返回的,并定义一个自己的异常返回报文格式。

一、先定义一个Filter,直接抛出异常

定义一个直接抛出异常的filter

public class ExceptionFilter implements GlobalFilter, Ordered {@Override    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {throw new IllegalArgumentException("参数不合法");    }@Override    public int getOrder() {return 0;    }
}

异常抛出如下图
在这里插入图片描述

json内容如下:

{"timestamp": "2023-08-28T03:55:02.380+00:00","path": "/hello-service/hello","status": 500,"error": "Internal Server Error","requestId": "0204dca5-1"
}

二、源码分析

上节我们分析了核心流程。在整个核心流程中,我们并没有关注有异常的情况。
入口HttpWebHandlerAdapter调用的delegate实际上就是:DefaultErrorWebExceptionHandler
在这里插入图片描述

代码如下:

@Override
public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {//省略部分代码return getDelegate().handle(exchange).doOnSuccess(aVoid -> logResponse(exchange)).onErrorResume(ex -> handleUnresolvedError(exchange, ex)).then(Mono.defer(response::setComplete));
}

进入DefaultErrorWebExceptionHandler的handle方法,分析见注释

@Override
public Mono<Void> handle(ServerWebExchange exchange) {Mono<Void> completion;try {//正常的处理流程completion = super.handle(exchange);}catch (Throwable ex) {completion = Mono.error(ex);}
//产生异常的情况,由异常处理器来进行处理for (WebExceptionHandler handler : this.exceptionHandlers) {completion = completion.onErrorResume(ex -> handler.handle(exchange, ex));}return completion;
}

如果产生异常的情况,由异常处理器来进行处理,这个异常处理器是一个列表。
而异常处理器最核心的就是这个:DefaultErrorWebExceptionHandler
其handle方法如下

@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable throwable) {if (exchange.getResponse().isCommitted() || isDisconnectedClientError(throwable)) {return Mono.error(throwable);}this.errorAttributes.storeErrorInformation(throwable, exchange);ServerRequest request = ServerRequest.create(exchange, this.messageReaders);return getRoutingFunction(this.errorAttributes).route(request).switchIfEmpty(Mono.error(throwable)).flatMap((handler) -> handler.handle(request)).doOnNext((response) -> logError(request, response, throwable)).flatMap((response) -> write(exchange, response));
}

跟到getRoutingFunction里面看看

@Override
protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {return route(acceptsTextHtml(), this::renderErrorView).andRoute(all(), this::renderErrorResponse);
}

最终跟到下面的这个方法:renderErrorResponse,从下面的截图可以看到,error Map这个对象,正是报文体的格式
在这里插入图片描述

如果我们想自定义一个异常响应的返回报文,如下,应该怎么弄呢?

{"returnCode": "ERROR","errorMsg": "参数异常","body": null
}

我们实际上可以继承DefaultErrorWebExceptionHandler,并且实现其renderErrorResponse方法就可以了。
可以看到DefaultErrorWebExceptionHandler,是通过下面的方式注入到容器的,如果我们也定义一个也注册到容器,那么就会覆盖原有的实现
在这里插入图片描述

整体流程图如下:

在这里插入图片描述

三、自定义异常处理器

1、定义一个产生异常的filter,模拟产生异常

@Slf4j
public class ExceptionFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("filter产生了异常");throw new IllegalArgumentException("参数不合法");}@Overridepublic int getOrder() {return 0;}
}

2、自定义异常处理器

/*** 自定义异常处理器*/
public class CustomErrorWebExceptionHandler extends DefaultErrorWebExceptionHandler {public CustomErrorWebExceptionHandler(ErrorAttributes errorAttributes, WebProperties.Resources resources, ErrorProperties errorProperties, ApplicationContext applicationContext) {super(errorAttributes, resources, errorProperties, applicationContext);}@Overrideprotected Mono<ServerResponse> renderErrorResponse(ServerRequest request) {// 最终是用responseBodyMap来生成响应body的Map<String, Object> responseBodyMap = new HashMap<>();// 这里和父类的做法一样,取得DefaultErrorAttributes整理出来的所有异常信息Map<String, Object> error = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));// 原始的异常信息可以用getError方法取得Throwable throwable = getError(request);responseBodyMap.put("returnCode", "my error code");responseBodyMap.put("errorMsg", throwable.getMessage());responseBodyMap.put("body", null);return ServerResponse// http返回码.status(HttpStatus.INTERNAL_SERVER_ERROR)// 类型和以前一样.contentType(MediaType.APPLICATION_JSON)// 响应body的内容.body(BodyInserters.fromValue(responseBodyMap));}
}

3、注册异常处理器

@Configuration(proxyBeanMethods = false)
public class ExceptionHandlerConfig {private final ServerProperties serverProperties;public ExceptionHandlerConfig(ServerProperties serverProperties) {this.serverProperties = serverProperties;}@Beanpublic ErrorWebExceptionHandler errorWebExceptionHandler(ErrorAttributes errorAttributes,WebProperties webProperties, ObjectProvider<ViewResolver> viewResolvers,ServerCodecConfigurer serverCodecConfigurer, ApplicationContext applicationContext) {CustomErrorWebExceptionHandler exceptionHandler = new CustomErrorWebExceptionHandler(errorAttributes,webProperties.getResources(), this.serverProperties.getError(), applicationContext);exceptionHandler.setViewResolvers(viewResolvers.orderedStream().collect(Collectors.toList()));exceptionHandler.setMessageWriters(serverCodecConfigurer.getWriters());exceptionHandler.setMessageReaders(serverCodecConfigurer.getReaders());return exceptionHandler;}
}

4、请求效果
在这里插入图片描述

http://www.yayakq.cn/news/760900/

相关文章:

  • 聊城网站策划网站建设发言
  • 电子商务网站建设与管理考卷泰安网络电视台直播
  • 利用ionic做的网站技术博客wordpress主题
  • 高端网站设计收费wordpress的评论插件
  • 宁乡做网站网站 跳出率 多少
  • 信息产业部互联网网站管理工作细则网站开发算互联网公司吗
  • 摄影后期教程网站怎么样学好网页设计
  • 十大SEO网站外链建设误区住建部2017建设工程合同范本
  • wordpress自动播放音乐专业网站优化培训
  • 产品介绍网站设计生意街创业商机网
  • 绍兴网站建设技术外包如何快速做h5网站
  • 文档下载网站 建设点餐小程序开发需要多少钱
  • 常州网络公司中环互联网网站建设网站推广软件哪家好
  • 网站前端凡科商城小程序怎么样
  • 龙华网站建设推广平台网站建设论文的摘要
  • 如何通过c语言来做网站昆山智能网站建设
  • php网站超市上海网站设计开发公司
  • 女人做春梦视频网站专业的建设网站
  • 平台后期维护东莞seo网站推广
  • app开发模板网站嵌入式培训出来能找到工作吗
  • 新公司 做网站 流程足球网站怎么做
  • 网站加载慢图片做延时加载有用wordpress 设置 多媒体 文件上传
  • 世界上网站做的好的例子社区电商app定制开发多少钱
  • 施工企业的施工现场消防安全责任人应是抖音seo搜索优化
  • 网站运营与推广苏州做网站优化哪家好
  • 大连辰熙大厦做网站无线网被附近多个
  • 网站屏幕自适应公司注册资金最低多少钱
  • 首页有动效的网站自建网站平台要多少钱
  • 网站关键词如何做优化wordpress优化图片分离
  • 网站建设为什么这么贵做网站是怎么回事