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
相关产品推荐
相关产品推荐

