spring boot api不时返回404 Not Found

Posted

技术标签:

【中文标题】spring boot api不时返回404 Not Found【英文标题】:spring boot api return 404 Not Found time to time 【发布时间】:2021-09-11 09:26:29 【问题描述】:

大部分时间使用正常,偶尔出现404。不知道怎么定位问题。

控制器文件:

@RestController
@RequestMapping("/auth")
@RequiredArgsConstructor
public class AuthController 

    private final AuthService authService;

    @GetMapping("info")
    public Result info(@RequestParam("token") String token) 
        Map<String, Object> stringObjectMap = authService.getInfo(token);

        return ResultGenerator.success(stringObjectMap);
    

GET: localhost:9000/v1/auth/info?token=gNGLJLLZsluDsIQw 此错误消息不时显示:


    "timestamp": "2021-06-29T06:46:35.477+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/auth/info"

版本信息:

弹簧靴:2.2.6.RELEASE 春云:Hoxton.SR1

追加:

spring cloud gateway yml 配置:

spring:
  application:
    name: gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Origin
      globalcors:
        cors-configurations:
          "[/**]":
            allowCredentials: true
            allowedOrigins: "*"
            allowedHeaders: "Origin, X-Requested-With, Content-Type, Accept, Content-Length, TOKEN, Authorization"
            allowedMethods: "GET, POST, PATCH, PUT, DELETE, OPTIONS"
            maxAge: 3628800
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
        - id: auth-service
          uri: lb://auth-service
          predicates:
            - Path=/v1/auth/**
          filters:
            - StripPrefix=1
        - id: bus-service
          uri: lb://bus-service
          predicates:
            - Path=/v1/**
          filters:
            - StripPrefix=1

解决方案待验证

我使用了zipkin,发现路由/v1/auth/info匹配bus-service(/v1/**),所以返回404 not found。

由此得出结论:路由的写入顺序并不能保证其匹配优先级。所以必须添加order配置。

【问题讨论】:

我想问题不在于这个控制器。请出示你的spring cloud代码 @DmitriyPankratov 我添加了网关的 yml 配置 【参考方案1】:

尝试删除 @RequestMapping("/auth") 并替换 @GetMapping("info") 如下所示:

@GetMapping("auth/info")
public Result info(@RequestParam("token") String token) 
    Map<String, Object> stringObjectMap = authService.getInfo(token);

【讨论】:

【参考方案2】:

请在这样的信息之前添加/

 @GetMapping("/info")
    public Result info(@RequestParam("token") String token) 
        Map<String, Object> stringObjectMap = authService.getInfo(token);

        return ResultGenerator.success(stringObjectMap);
    

由于您使用的是@RequestParam,因此您需要像这样传递值

localhost:9000/auth/info?token="token_value"

【讨论】:

对不起,我忘了补充这个问题。我更新了这个问题【参考方案3】:

请检查:

如果 url 有 lb 方案(即 lb://myservice),它将使用 Spring Cloud LoadBalancerClient 解析名称(myservice 在 上一个示例)到一个实际的主机和端口,并替换 URI 相同的属性。

默认情况下,当负载均衡器中找不到服务实例时 将返回 503。您可以配置网关返回 404 通过设置 spring.cloud.gateway.loadbalancer.use404=true。

您也可以尝试在路线列表中指定顺序

routes:
  - id: auth-service
    uri: lb://auth-service
    order: 0
    predicates:
      - Path=/v1/auth/**
    filters:
      - StripPrefix=1
  - id: bus-service
    uri: lb://bus-service
    order: 1
    predicates:
      - Path=/v1/**
    filters:
      - StripPrefix=1

【讨论】:

谢谢,你的回答启发了我。我可能发现了问题

以上是关于spring boot api不时返回404 Not Found的主要内容,如果未能解决你的问题,请参考以下文章

spring boot rest api测试得到404错误

Spring Boot - 当我调用 API 时,它给出 404 错误

Spring Boot 2.5.6 API 网关 + Eureka Server = 404

仅在 REST API 调用上的 Spring Boot 404

Spring Boot REST API 生成 404 Not Found

为啥 Spring Boot Actuator 返回 404 而不是 401?