java - 捕获身份验证异常
问题描述
我使用此代码发送 XML 请求:
RestClient client = RestClientBuilder.builder()
.gatewayUrl(URL)
.build();
Mono<AuthorizeResponse> result = client.executeAndReceiveAuthorize(request);
response = result.block();
public RestClient(String gatewayUrl, String token, String username, String password, SslContext sslContext) {
this.token = token;
this.gatewayUrl = gatewayUrl;
WebClient.Builder builder = WebClient.builder().baseUrl(gatewayUrl);
if (sslContext != null) {
HttpClient httpClient = HttpClient.create().secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
ClientHttpConnector httpConnector = new ReactorClientHttpConnector(httpClient);
builder.clientConnector(httpConnector);
}
if (username != null && password != null) {
builder.filter(basicAuthentication(username, password));
}
client = builder.build();
}
public Mono<AuthorizeResponse> executeAndReceiveAuthorize(AuthorizeRequest transaction) {
Mono<AuthorizeRequest> transactionMono = Mono.just(transaction);
return client.post().uri(checkTrailingSlash(gatewayUrl) + token)
.header(HttpHeaders.USER_AGENT, "Mozilla/5.0")
.accept(MediaType.APPLICATION_XML)
.contentType(MediaType.APPLICATION_XML)
.body(transactionMono, AuthorizeRequest.class)
.retrieve()
.bodyToMono(AuthorizeResponse.class);
}
但有时我会收到此错误:
org.springframework.web.reactive.function.client.WebClientResponseException$Unauthorized: 401 Unauthorized
at java.base/java.lang.Thread.run(Thread.java:834)
2019-08-27 22:05:45,720 ERROR [stderr] (processingTransactionGenesisAuthorizeContainer-1) Suppressed: java.lang.Exception: #block terminated with an error
Caused by: java.lang.NullPointerException: null
当我收到错误 401 时如何捕获和处理异常?如果可能的话,我想在 line 之后处理异常response = result.block();
。
解决方案
首先,block
在响应式代码中显式使用并不是一个好主意。这背后的原因是,它将代码变成了阻塞,这不是反应流应该如何工作的。所以,请删除response = result.block();
现在,如果您想处理特定状态,那么您可以修改您的方法executeAndReceiveAuthorize
以使用WebClient
onStatus(Predicate<HttpStatus> var1, Function<ClientResponse, Mono<? extends Throwable>> var2)
public Mono<AuthorizeResponse> executeAndReceiveAuthorize (AuthorizeRequest transaction){
Mono<AuthorizeRequest> transactionMono = Mono.just(transaction);
return client.post().uri(checkTrailingSlash(gatewayUrl) + token)
.header(HttpHeaders.USER_AGENT, "Mozilla/5.0").accept(MediaType.APPLICATION_XML)
.contentType(MediaType.APPLICATION_XML).body(transactionMono, AuthorizeRequest.class)
.retrieve().onStatus(status -> status == HttpStatus.UNAUTHORIZED, clientResponse -> Mono
.error(new SomeCustomAuthorizationException("Some failure exception")))
.bodyToMono(AuthorizeResponse.class);
}
推荐阅读
- android - 如何在 Kotlin 中将 List 转换为 ArrayList
- javascript - 达到容量时,IndexedDB 拒绝删除存储
- nginx - NGINX Slug 目录重写
- java - 如何将字节转换为更有用的数据?
- javascript - 如何通过 React 中的预签名 S3 URL 预览图像?
- dictionary - Kotlin 地图类型推断失败
- wordpress - Wordpress CMS 上的一个站点多个主题
- python - SQLAlchemy - 渴望加载子查询作为 ORM 类的列
- c++ - dll中类的友元函数
- python - Numpy:就数组 B 的匹配元素的索引而言,数组 A 的有效元素