捕获身份验证异常

时间:2019-08-27 22:11:55

标签: java spring spring-boot spring-webflux

我使用以下代码发送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();行之后处理异常。

2 个答案:

答案 0 :(得分:2)

第一件事是,在反应式代码中显式使用block并不是一个好主意。其背后的原因是,它将代码变成阻塞,而不是反应流应该如何工作。因此,请删除response = result.block();

现在,如果要处理特定状态,则可以修改executeAndReceiveAuthorize方法以使用WebClient的{​​{1}}

onStatus(Predicate<HttpStatus> var1, Function<ClientResponse, Mono<? extends Throwable>> var2)

答案 1 :(得分:1)

如何在mono上定义doOnError

例如:

Mono<AuthorizeResponse> result = client.executeAndReceiveAuthorize(request);
response = result.doOnError(e -> {
                      throw new RuntimeException(e);
                  })
                 .block();

如果需要访问json响应,还请选中此answer