我有一个声明性的客户端接口,我正在从控制器中使用它。我完全希望通过我的服务进行身份验证现在会失败,但是我很好奇为什么我无法管理该异常...
@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。但是我什至不知道如何从异步响应中获取服务调用的状态代码。
答案 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
返回响应。