Java 假装客户端错误处理-抑制错误/异常并转换为200成功响应
我正在使用外部客户端连接到下游服务 我得到一个要求,当一个下游服务端点返回400(这是部分成功的场景)时,我们的服务需要使用响应值将其转换为200成功 我正在寻找一个最好的方法来做到这一点Java 假装客户端错误处理-抑制错误/异常并转换为200成功响应,java,spring-boot,spring-cloud-feign,netflix-feign,feign,Java,Spring Boot,Spring Cloud Feign,Netflix Feign,Feign,我正在使用外部客户端连接到下游服务 我得到一个要求,当一个下游服务端点返回400(这是部分成功的场景)时,我们的服务需要使用响应值将其转换为200成功 我正在寻找一个最好的方法来做到这一点 我们使用错误解码器来处理错误,上面的转换只适用于一个端点,而不是所有下游端点,注意decode()方法应返回异常。您需要创建一个定制的客户端,以便尽早截获响应,从而更改响应状态,而不调用错误解码器。最简单的方法是在现有客户机上创建一个包装器,并创建一个状态为200的新Response。下面是使用Feign的A
我们使用错误解码器来处理错误,上面的转换只适用于一个端点,而不是所有下游端点,注意decode()方法应返回异常。您需要创建一个定制的
客户端
,以便尽早截获响应
,从而更改响应状态,而不调用错误解码器
。最简单的方法是在现有客户机上创建一个包装器,并创建一个状态为200
的新Response
。下面是使用Feign的ApacheHttpClient
时的一个示例:
公共类ClientWrapper扩展了ApacheHttpClient{
私人ApacheHttpClient代表;
公共客户端包装器(ApacheHttpClient客户端){
this.client=client;
}
@凌驾
公共响应执行(请求、请求、请求、选项)抛出IOException{
/*对委托执行请求*/
响应=this.client.execute(请求、选项);
/*检查响应代码并进行更改*/
if(response.status()==400){
response=response.builder(response.status(200.build));
}
返回响应;
}
}
此自定义客户端可用于您需要的任何外部客户端。另一种方法是在错误解码器中抛出自定义异常,并在spring全局异常处理程序中将此自定义异常转换为成功(使用@RestControllerAdvice) 和异常处理程序,如下所示
@RestControllerAdvice
public class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(PartialSuccessException.class)
public ResponseData handlePartialSuccessException(
PartialSuccessException ex) {
return ex.getResponseData();
}
}
谢谢kevin,我通过扩展默认的假客户机尝试了这种逻辑,因为我们没有使用ApacheHttpClient,看起来不错,只是我找不到可用的Response.builder(Response)方法(我使用的是faign-core-9.5.0.jar)。我试过下面提到的另一种方法作为另一个答案。@Shanid,你是对的。此支持是在Faign 10.x中添加的。请参阅下面的线程
@RestControllerAdvice
public class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(PartialSuccessException.class)
public ResponseData handlePartialSuccessException(
PartialSuccessException ex) {
return ex.getResponseData();
}
}