You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Swagger+Zuul网关访问Swagger文档报NumberFormatException求助

解决Spring Boot+Swagger+Zuul架构下Swagger访问的NumberFormatException问题

针对你遇到的因请求头传入逗号分隔多端口(如"80,80")导致的java.lang.NumberFormatException,可以通过以下几种方式解决:

1. 自定义Zuul前置过滤器处理多端口请求头

编写Zuul的Pre类型过滤器,在请求转发至后端服务前,将逗号分隔的端口字符串提取第一个有效值,替换原请求头:

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

@Component
public class PortHeaderProcessingFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        // 仅对Swagger相关路径生效,避免影响其他业务
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String uri = request.getRequestURI();
        return uri.contains("/swagger") || uri.contains("/v2/api-docs");
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        
        // 替换为实际导致报错的请求头名称,如X-Forwarded-Port
        String multiPortHeader = request.getHeader("X-Forwarded-Port");
        if (multiPortHeader != null && multiPortHeader.contains(",")) {
            String singlePort = Arrays.stream(multiPortHeader.split(","))
                                      .findFirst()
                                      .orElse(multiPortHeader);
            // 覆盖原请求头
            ctx.addZuulRequestHeader("X-Forwarded-Port", singlePort);
        }
        return null;
    }
}

2. 修改Swagger配置,在获取端口时处理多值情况

在Swagger的Docket配置中,自定义端口解析逻辑,直接对逗号分隔的端口字符串做拆分处理:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public Docket apiDocket(HttpServletRequest request) {
        String defaultPort = "8080";
        String portHeader = request.getHeader("X-Forwarded-Port");
        String targetPort = defaultPort;
        
        if (portHeader != null) {
            // 拆分端口字符串,取第一个有效值
            targetPort = Arrays.stream(portHeader.split(","))
                               .findFirst()
                               .orElse(portHeader);
        }

        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.yourcompany.yourproject"))
                .paths(PathSelectors.any())
                .build()
                .host(request.getServerName() + ":" + targetPort);
    }
}

3. 调整Zuul全局配置(谨慎使用)

如果是Zuul默认转发的多端口请求头导致问题,可以通过配置禁用该请求头的转发,或关闭代理头自动添加:

zuul:
  # 忽略指定请求头的转发
  ignored-headers: X-Forwarded-Port
  # 或关闭自动添加代理相关请求头
  add-proxy-headers: false

注意:此方案可能影响其他依赖该请求头的业务逻辑,需充分测试后使用。

关键注意点

  • 先通过日志定位具体是哪个请求头导致的解析错误(常见为X-Forwarded-Port),再针对性处理;
  • 优先使用过滤器或Swagger配置修改的方案,避免全局配置影响其他业务;
  • 测试时验证Swagger文档正常访问的同时,确保其他业务请求不受影响。

内容的提问来源于stack exchange,提问作者Ziaullhaq Savanur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:35:21