为何无法像requestInterceptors一样修改DefaultRestClientBuilder的StatusHandler?
为什么不能像修改请求拦截器那样操作DefaultRestClientBuilder里的StatusHandler?
核心原因是StatusHandler是包级私有类——这和ClientHttpRequestInterceptor的公开访问权限完全不同:
- 你可以在任何地方实例化、修改
ClientHttpRequestInterceptor实现类,所以requestInterceptors(Consumer<List<ClientHttpRequestInterceptor>>)能让外部直接操作拦截器列表; - 但StatusHandler的包级私有特性,导致外部代码根本无法引用这个类型,连编译都过不了,自然没法提供类似的开放API让你直接操作其内部列表。
你提到的这种直接暴露内部StatusHandler列表给Consumer的实现逻辑上是通顺的,但因为StatusHandler的访问限制,外部代码根本没法使用这个API——你连在Consumer里写List<StatusHandler>都会报错,更别说做移除、排序这类操作了。
附上你提到的实现代码(已将英文注释翻译为中文):
@Override public RestClient.Builder defaultStatusHandler(Predicate<HttpStatusCode> statusPredicate, RestClient.ResponseSpec.ErrorHandler errorHandler) { defaultStatusHandlerInternal().add(StatusHandler.of(statusPredicate, errorHandler)); return this; } @Override @SuppressWarnings("removal") public RestClient.Builder defaultStatusHandler(ResponseErrorHandler errorHandler) { defaultStatusHandlerInternal().add(StatusHandler.fromErrorHandler(errorHandler)); return this; } /** * 新增方法:通过传入的Consumer操作状态处理器列表。提供给Consumer的列表是"实时"的, * 因此可以用来移除状态处理器、调整顺序等。 * @param statusHandlerConsumer 处理状态处理器列表的函数 * @return 当前Builder实例 */ @Override public RestClient.Builder defaultStatusHandlers(Consumer<List<StatusHandler>> statusHandlerConsumer) { statusHandlerConsumer.accept(defaultStatusHandlerInternal()); return this; } private List<StatusHandler> defaultStatusHandlerInternal() { if (this.statusHandlers == null) { this.statusHandlers = new ArrayList<>(); } return this.statusHandlers; }
内容的提问来源于stack exchange,提问作者GreenGoblin
相关产品推荐
相关产品推荐

