WebClient 异常处理程序
WebClient exception handler
我想为调用外部 API 的 WebClient 创建异常处理程序。我不想使用 onStatus() 方法,因为我有具有不同方法的抽象 Web 客户端,我必须在其中处理异常,所以我必须在我的每个抽象方法中复制粘贴每个 onStatus()。我想做一些类似于 rest 模板方法的事情:我们可以实现 ResponseErrorHandler 并将我们的实现添加到 resttemplate 中,例如设置异常处理程序(我们的实现)。我想要一个 class 来处理所有异常。
提前感谢您的建议!
你可以那样做
@ControllerAdvice
public class ErrorControllerAdvice {
@ExceptionHandler({RuntimeException.class})
public ResponseEntity<?> handleRuntimeException(RuntimeException e) {
log.error(e.getMessage(), e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
@ExceptionHandler({Exception.class})
public ResponseEntity<?> handleRuntimeException(Exception e) {
log.error(e.getMessage(), e);
return ResponseEntity.status(HttpStatus.OK)
.body(e.getMessage());
}
}
@Bean
public WebClient buildWebClient() {
Function<ClientResponse, Mono<ClientResponse>> webclientResponseProcessor =
clientResponse -> {
HttpStatus responseStatus = clientResponse.statusCode();
if (responseStatus.is4xxClientError()) {
System.out.println("4xx error");
return Mono.error(new MyCustomClientException());
} else if (responseStatus.is5xxServerError()) {
System.out.println("5xx error");
return Mono.error(new MyCustomClientException());
}
return Mono.just(clientResponse);
};
return WebClient.builder()
.filter(ExchangeFilterFunction.ofResponseProcessor(webclientResponseProcessor)).build();
}
我们可以使用ResponseProcessor来编写逻辑,处理不同的http状态。此解决方案已经过测试并且有效。
我想为调用外部 API 的 WebClient 创建异常处理程序。我不想使用 onStatus() 方法,因为我有具有不同方法的抽象 Web 客户端,我必须在其中处理异常,所以我必须在我的每个抽象方法中复制粘贴每个 onStatus()。我想做一些类似于 rest 模板方法的事情:我们可以实现 ResponseErrorHandler 并将我们的实现添加到 resttemplate 中,例如设置异常处理程序(我们的实现)。我想要一个 class 来处理所有异常。 提前感谢您的建议!
你可以那样做
@ControllerAdvice
public class ErrorControllerAdvice {
@ExceptionHandler({RuntimeException.class})
public ResponseEntity<?> handleRuntimeException(RuntimeException e) {
log.error(e.getMessage(), e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
@ExceptionHandler({Exception.class})
public ResponseEntity<?> handleRuntimeException(Exception e) {
log.error(e.getMessage(), e);
return ResponseEntity.status(HttpStatus.OK)
.body(e.getMessage());
}
}
@Bean
public WebClient buildWebClient() {
Function<ClientResponse, Mono<ClientResponse>> webclientResponseProcessor =
clientResponse -> {
HttpStatus responseStatus = clientResponse.statusCode();
if (responseStatus.is4xxClientError()) {
System.out.println("4xx error");
return Mono.error(new MyCustomClientException());
} else if (responseStatus.is5xxServerError()) {
System.out.println("5xx error");
return Mono.error(new MyCustomClientException());
}
return Mono.just(clientResponse);
};
return WebClient.builder()
.filter(ExchangeFilterFunction.ofResponseProcessor(webclientResponseProcessor)).build();
}
我们可以使用ResponseProcessor来编写逻辑,处理不同的http状态。此解决方案已经过测试并且有效。