问题:

当使用feign远程调用服务提供方的方法,而方法中带有HttpServletResponse参数时,会报以下错误,导致response无法传递:

java.lang.IllegalStateException: getOutputStream() has already been called for this response

解决方法:

使用Feign原生的 feign.Response 做返回,调用方解析Response,写入自己响应流
详细代码:
服务提供方:
在这里插入图片描述

消费方:
fenclient:
在这里插入图片描述
业务调用:
在这里插入图片描述
feign.Response和HttpServletResponse的转换工具类:

public class ConvertUtil {
    @SneakyThrows
    public static void feignResp2ServletResp(Response feignResponse, HttpServletResponse response) {
        Response.Body body = feignResponse.body();
        try (InputStream inputStream = body.asInputStream(); OutputStream outputStream = response.getOutputStream())
        {
            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, feignResponse.headers().get(HttpHeaders.CONTENT_DISPOSITION).stream().findFirst().get());
            response.setContentType(feignResponse.headers().get(HttpHeaders.CONTENT_TYPE).stream().findFirst().get());
            IOUtils.copy(inputStream, outputStream);
        }
    }
}

成功:

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐