Java 如何在将exchange()与Spring WebClient一起使用时引发WebClientResponseException

Java 如何在将exchange()与Spring WebClient一起使用时引发WebClientResponseException,java,spring,spring-webclient,Java,Spring,Spring Webclient,将Spring WebClient的retrieve()方法与BodyTomo结合使用时,不会应用默认错误处理(如果响应的状态代码为4xx或5xx,Mono将包含WebClient异常)。在出现错误的情况下,产生的WebClientException非常有用,因为它包含请求和响应,这非常方便,例如用于日志记录。此外,我可以在适当的地方对错误做出很好的反应 /* *易于使用的retrieve()和默认错误处理: *默认情况下,如果响应的状态代码为4xx或5xx,Mono将包含WebClientEx

将Spring WebClient的retrieve()方法与BodyTomo结合使用时,不会应用默认错误处理(如果响应的状态代码为4xx或5xx,Mono将包含WebClient异常)。在出现错误的情况下,产生的WebClientException非常有用,因为它包含请求和响应,这非常方便,例如用于日志记录。此外,我可以在适当的地方对错误做出很好的反应

/*
*易于使用的retrieve()和默认错误处理:
*默认情况下,如果响应的状态代码为4xx或5xx,Mono将包含WebClientException-真棒!
*/
公共可选getMyType(){
试一试{
MyType结果=客户端
.get()
.uri(“/myType”)
.retrieve().bodytomino(MyType.class).block();
返回可选的。不可用的(结果);
}捕获(未找到e){
返回可选的.empty();
}
}
但是,有时我需要知道响应的确切状态代码,以便在进一步处理此响应时对其作出反应。获取状态代码的唯一方法是调用exchange()方法,而不是retrieve()方法。不幸的是,在这种情况下,默认错误处理不适用。这似乎是因为在ClientResponse上调用bodyTomino()与在ResponseSpec上调用bodyTomino()具有不同的语义

我无法从Spring调用已经实现的方法来“触发”错误处理,因为所有nice方法都作为私有方法隐藏在WebClient中

即使我尝试“手动”创建WebClientResponseException,我也不能 访问请求以向异常提供提要

公共字符串updateMyType(){
ClientResponse响应=客户端
.put()
.uri(“/myType”)
.header(内容类型、应用程序值)
.body(fromObject(新的MyType()))
.exchange()
.block();
if(response.statusCode().equals(HttpStatus.CREATED)){
返回“OK”;
}else if(response.statusCode().equals(HttpStatus.NO_内容)){
返回“更新”;
}否则{
byte[]bodyBytes=null;//已由Sping实现,但不可访问
Charset Charset=null;//已由Sping实现,但不可访问
HttpRequest request=null;//我应该从哪里获取此信息?
抛出WebClientResponseException.create(response.statusCode().value(),
response.statusCode().getReasonPhrase(),
response.headers().asHttpHeaders(),
体字节,
charset,
请求);
}
}

“模仿”retrieve()方法相同行为的最佳方式是什么?

回答问题时可能不是这样,但从Spring 5.2开始,
ClientResponse
有一个
createException()
方法,该方法将构建并返回一个
Mono

clientResponse.createException()
              .flatMap(e -> handleException(e))