我正在使用Spring Boot2和Spring5和WebFlux reactive starter开发一些反应式微服务。
我面临以下问题:我想要处理调用另一个REST服务时收到的所有HTTP状态,并在收到一些糟糕的HTTP状态时抛出异常。例如,当我调用一个端点并收到404HTTP状态时,我想抛出一个异常,该异常将在某个ExceptionHandler类中处理,就像在Spring4中使用@ControllerAdvice时一样。
这样做的正确方法是什么?希望能收到一些好的建议。
发布于 2018-04-04 19:29:33
这可以通过两个独立的部分来解决。
如何将WebClient收到的HTTP404响应转换为自定义异常
使用WebClient时,您可以从远程服务接收HTTP404响应。默认情况下,所有4xx和5xx客户端响应都将转换为WebClientResponseException。因此,您可以直接在WebFlux应用程序中处理这些异常。
如果您只想将404个响应转换为自定义异常,您可以执行以下操作:
WebClient webClient = //...
webClient.get().uri("/persons/1")
.retrieve()
.onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus),
clientResponse -> Mono.error(new MyCustomException()))
.bodyToMono(...);这显然是基于每个客户端调用完成的。
您可以通过一种更具可重用性的方式实现同样的效果,您可以在WebClient实例上一次性设置ExchangeFilterFunction,如下所示:
WebClient.builder().filter(myExchangeFilterFunction)...如何处理WebFlux应用程序中的自定义异常
使用带有注释的Spring WebFlux,您可以使用带有@ExceptionHandler注释的方法来处理异常(请参阅Spring Framework reference documentation)。
注意:使用WebExceptionHandler是可能的,但它的级别非常低,因为您在那里没有高级支持:您需要手动编写带有buffers的响应,而不支持任何序列化。
发布于 2018-04-04 18:37:12
我想你要找的是为reference检查WebFluxResponseStatusExceptionHandler。
在WebFilter中,可以使用WebExceptionHandler来处理来自WebFilter链和目标WebHandler的异常。在使用WebFlux配置时,注册WebExceptionHandler就像将其声明为Spring bean一样简单,并可选择通过bean声明中的@Order或通过实现Order来表示优先级。
This example可能会有所帮助,但我自己还没有尝试过。
@Component
@Order(-2)
class RestWebExceptionHandler implements WebExceptionHandler{
@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
if (ex instanceof PostNotFoundException) {
exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
// marks the response as complete and forbids writing to it
return exchange.getResponse().setComplete();
}
return Mono.error(ex);
}
}
class PostNotFoundException extends RuntimeException {
PostNotFoundException(String id) {
super("Post:" + id + " is not found.");
}
}https://stackoverflow.com/questions/49648435
复制相似问题