如何为 ZuulException 自定义 Spring Boot 控制器 API 响应

Posted

技术标签:

【中文标题】如何为 ZuulException 自定义 Spring Boot 控制器 API 响应【英文标题】:How to customize Spring boot controller API response for ZuulException 【发布时间】:2019-04-15 05:24:16 【问题描述】:

我们正在为 REST API 使用 Zuul、Eureka 和 Spring Boot 应用程序服务。

假设我的 spring boot 服务已关闭,当我尝试使用 Zuul API 网关访问 API 时,我收到 ZuulException 并且响应如下:


    "timestamp": "2018-10-12T14:29:09.632+0000",
    "status": 500,
    "error": "Internal Server Error",
    "exception": "com.netflix.zuul.exception.ZuulException",
    "message": "GENERAL"

我想自定义响应格式如下:


    "success": false,
    "message": "Service is down. Please try later"

我尝试实现https://***.com/a/39841785/5506061,但它对我不起作用。

请建议如何自定义 ZuulException 的响应。

【问题讨论】:

【参考方案1】:

如果需要,您可以实现自己的 FallbackProvider 并根据原因自定义响应。

类似:

@Component
public class CustomFallbackBasedOnCause implements FallbackProvider 

private static final String DEFAULT_MSG = "\"success\": false,\"message\": \"Service is down. Please try later\"";

@Override
public String getRoute() 
    return "*"; // * = all routes


@Override
public ClientHttpResponse fallbackResponse(final Throwable cause) 
    if (cause instanceof HystrixTimeoutException) 
        return response(HttpStatus.GATEWAY_TIMEOUT);
     else 
        return fallbackResponse();
    


@Override
public ClientHttpResponse fallbackResponse() 
    return response(HttpStatus.INTERNAL_SERVER_ERROR);


private ClientHttpResponse response(final HttpStatus status) 
    return new ClientHttpResponse() 
        @Override
        public HttpStatus getStatusCode() throws IOException 
            return status;
        

        @Override
        public int getRawStatusCode() throws IOException 
            return status.value();
        

        @Override
        public String getStatusText() throws IOException 
            return status.getReasonPhrase();
        

        @Override
        public void close() 
        

        @Override
        public InputStream getBody() throws IOException 
            return new ByteArrayInputStream(DEFAULT_MSG.getBytes());
        

        @Override
        public HttpHeaders getHeaders() 
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            return headers;
        
    ;


正如您在 getRoute() 方法中所见,您可以指定此 customFallback 是用于所有路由 (return "*") 还是用于特定路由。

如果您使用 Registry 服务(例如 Eureka)。您不指定路由 URL,而是指定服务 ID。 return "SERVICEID"

【讨论】:

以上是关于如何为 ZuulException 自定义 Spring Boot 控制器 API 响应的主要内容,如果未能解决你的问题,请参考以下文章

如何为自定义控件创建事件

如何为 Handsontable 中的每一列定义自定义验证器

如何为 iPhone 创建自定义 Interface Builder 插件?

如何为 AVD 管理器创建自定义 Android 设备配置文件?

如何为 Jcrop 'setSelect' 选项指定自定义值?

如何为自定义输入迭代器定义指针