首页 > 解决方案 > 捕获身份验证异常

问题描述

我使用此代码发送 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();

标签: javaspringspring-bootspring-webflux

解决方案


首先,block在响应式代码中显式使用并不是一个好主意。这背后的原因是,它将代码变成了阻塞,这不是反应流应该如何工作的。所以,请删除response = result.block();

现在,如果您想处理特定状态,那么您可以修改您的方法executeAndReceiveAuthorize以使用WebClientonStatus(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);
}

推荐阅读