使用声明性客户端异常总是从 Controller 中抛出 500

Using Declarative Client Exceptions always throws 500 from Controller

我有一个声明式客户端界面,我正在通过控制器使用它。我完全希望我的服务的身份验证现在会失败,但我很好奇为什么我无法管理该异常...

@Controller("/order-gateway/orders")
public class OrderController {
    private final OrderClient client;

    public OrderController(OrderClient client) {
        this.client = client;
    }

    @Post
    @Produces(MediaType.TEXT_PLAIN)
    public Single<String> createOrder() {
        return client.createOrder();
    }
}

以上所有只是示例代码,但是当客户端调用服务端点时,它未被授权并且 returns 一个 401。但是我上面的控制器返回一个 500,因为 client.createOrder()正在抛出获取 401 的异常。

我有点希望能够处理这个问题,但我已经尝试了 doOnErrors 和其他似乎无法阻止 500 的方法。如果有的话,我想冒泡 401 或至少,更优雅地处理 500。但是我什至不知道如何从异步响应中获取服务调用的状态码。

所以您可能正在寻找这样的东西:

    @Post
    @Produces(MediaType.TEXT_PLAIN)
    Single<MutableHttpResponse<String>> createOrder() {
        return client.createOrder()
                .map(HttpResponse::ok)
                .onErrorReturn(t -> {
                    HttpClientResponseException exception = (HttpClientResponseException) t;
                    return HttpResponse.status(exception.getStatus());
                });
    }

为了传播响应状态,您必须 return 一个 http 响应而不仅仅是正文发布者。然后需要您将客户端调用映射到成功案例中的响应。在上面的示例中,我还使用 onErrorReturn 到 return 出现错误时的响应。