首页 > 解决方案 > 为什么我的 WebClient 异常没有被捕获?

问题描述

我有一个方法,当用户单击按钮时,它会调用另一个方法并调用 WebClient 等。基本上,WebClient 会引发异常,但调用方法没有捕获它。

例如,这是一个缩短的版本:

调用方法

    try {
        service.getMessageAsync(messageDto, results -> getUI().ifPresent(ui -> ui.access(() -> {
                .... code here ....
        })));
    } catch (RuntimeException e) {
        logger.error("RuntimeException (startEtl):");
        logger.error("\tException: {0}", e);
    }

服务方式

public void getMessageAsync(MessageDto messageDto, AsyncRestCallback<MessageDto> callback)
        throws RuntimeException {

    ... code omitted ...

    WebClient.RequestHeadersSpec<?> spec = WebClient
            .create()
            .post()
            .uri(URI)
            .body(Mono.just(messageDto), MessageDto.class)
            .headers(httpHeaders -> httpHeaders.setBasicAuth(username, password));

    spec
            .retrieve()
            .onStatus(HttpStatus::is4xxClientError, error -> Mono.error(new RuntimeException("4xx Client Error.")))
            .onStatus(HttpStatus::is5xxServerError, error -> Mono.error(new RuntimeException("5xx Server Error.")))
            .toEntityList(MessageDto.class).subscribe(result -> {

                callback.operationFinished(message.get(0));
    });
}

所以,在我的日志中,我可以清楚地看到这些4xx Client Error.条目。我不确定它们在日志中的情况。但我RuntimeException (startEtl):在调用方法中看不到 。

我确定我忽略了一些明显的东西,但我似乎找不到它。

那么为什么调用异常处理没有像我预期的那样工作呢?是因为onStatus在内部以某种方式处理异常吗?

谢谢

标签: javaspring-bootexceptionspring-webclient

解决方案


推荐阅读