我使用以下代码发送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时如何捕获和处理异常?
如果可能的话,我想在第response = result.block();
行之后处理异常。
答案 0 :(得分:2)
第一件事是,在反应式代码中显式使用block
并不是一个好主意。其背后的原因是,它将代码变成阻塞,而不是反应流应该如何工作。因此,请删除response = result.block();
现在,如果要处理特定状态,则可以修改executeAndReceiveAuthorize
方法以使用WebClient
的{{1}}
onStatus(Predicate<HttpStatus> var1, Function<ClientResponse, Mono<? extends Throwable>> var2)
答案 1 :(得分:1)