使用声明性客户端异常总是从 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 出现错误时的响应。
我有一个声明式客户端界面,我正在通过控制器使用它。我完全希望我的服务的身份验证现在会失败,但我很好奇为什么我无法管理该异常...
@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 出现错误时的响应。