使用声明性客户端异常总是会从控制器抛出500

时间:2019-04-10 19:26:18

标签: micronaut

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

@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();
    }
}

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

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

1 个答案:

答案 0 :(得分:2)

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

    @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());
                });
    }

为了传播响应状态,您必须返回http响应,而不仅仅是正文发布者。然后,您需要在成功案例中将客户呼叫映射到响应。在上面的示例中,如果发生错误,我还使用onErrorReturn返回响应。