Spring Boot中GraphQL请求被识别为静态资源报404问题求助
排查思路:GraphQL请求被当作静态资源返回404
针对你遇到的REST接口正常、GraphQL请求被静态资源处理器处理返回404的问题,按以下步骤排查:
1. 先确认服务本身的GraphQL端点是否正常
跳过Kubernetes Ingress,直接在Pod内部测试服务的GraphQL端点:
curl -X POST http://localhost:8080/graphql -H "Content-Type: application/json" -d '{"query":"{ __typename }"}'
如果返回正常的GraphQL响应,说明问题出在Ingress路由配置;如果仍然返回404,说明服务内部的GraphQL配置存在问题。
2. 验证GraphQL自动配置是否生效
- 检查依赖:确保项目中已引入
spring-boot-starter-graphql依赖(Maven/Gradle),没有该依赖的话,Spring Boot不会自动注册GraphQL控制器,请求会落到静态资源处理器。 - 查看启动日志:启动应用时,搜索是否有类似以下日志:
GraphQL endpoint configured at '/graphql'
Loaded GraphQL schema from locations [classpath*:graphql/**/]
若没有这类日志,说明GraphQL自动配置未生效,可能是依赖缺失或配置被覆盖。 - 通过Actuator查看请求映射:启用
mappings端点(修改management.endpoints.web.exposure.include添加mappings),访问http://localhost:9090/actuator/mappings,搜索/graphql,确认是否存在GraphQlHttpController对应的映射。如果没有,说明GraphQL控制器未注册。
3. 排查Ingress路由的路径匹配与重写
错误提示中的路径是my-service/graphql,说明Ingress可能将请求转发到了服务的/my-service/graphql路径,而你的服务配置中GraphQL路径是/graphql,导致路径不匹配:
- 若使用Nginx Ingress,需配置路径重写注解,将前缀
/my-service去掉:
该配置会将apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - http: paths: - path: /my-service(/|$)(.*) pathType: Prefix backend: service: name: my-service port: number: 8080/my-service/graphql重写为/graphql,匹配服务的GraphQL端点。 - 确认Ingress的路径规则是否与服务的实际路径对齐:如果服务设置了
server.servlet.context-path=/my-service,则GraphQL端点路径为/my-service/graphql,Ingress需直接转发到该路径,无需重写。
4. 检查Spring MVC的请求处理优先级与规则
静态资源处理器的优先级高于@RequestMapping控制器,当请求路径未匹配到任何控制器映射时,才会被静态资源处理器接管:
- 检查是否有自定义
WebMvcConfigurer或RequestMappingHandlerMapping修改了路径匹配规则(如全局路径前缀、路径忽略),导致/graphql未被映射到GraphQL控制器。 - 若存在自定义路径配置,需确保
/graphql路径被排除在规则之外,或明确包含该路径的映射。
5. 排查拦截器/过滤器的影响
自定义的拦截器、过滤器可能会修改请求路径或拦截请求,导致请求无法到达GraphQL控制器:
- 临时禁用所有自定义拦截器、过滤器,测试GraphQL请求是否恢复正常。
- 若禁用后正常,逐一排查每个拦截器/过滤器,确认是否对
/graphql路径做了错误处理。
内容的提问来源于stack exchange,提问作者Priya Mounica
相关产品推荐
相关产品推荐

