Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 假装客户端错误处理-抑制错误/异常并转换为200成功响应_Java_Spring Boot_Spring Cloud Feign_Netflix Feign_Feign - Fatal编程技术网

Java 假装客户端错误处理-抑制错误/异常并转换为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

我正在使用外部客户端连接到下游服务

我得到一个要求,当一个下游服务端点返回400(这是部分成功的场景)时,我们的服务需要使用响应值将其转换为200成功

我正在寻找一个最好的方法来做到这一点


我们使用错误解码器来处理错误,上面的转换只适用于一个端点,而不是所有下游端点,注意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();
    }
}