【问题标题】:SpringBoot Controller mapping to incorrect methodSpringBoot 控制器映射到不正确的方法
【发布时间】:2022-01-23 06:40:45
【问题描述】:

我的控制器中有以下 2 个 GET 映射:

1. @GetMapping("/department/{deptId}/employee/{employeeId}")
public String func1(@PathVariable(value = "deptId", required = true) String deptId, 
                    @PathVariable(value = "employeeId", required = true) String employeeId) { ... }
2. @GetMapping("/department/{deptId}/employee/{employeeId}/workLogs")
public String func2(@PathVariable(value = "deptId", required = true) String deptId, 
                    @PathVariable(value = "employeeId", required = true) String employeeId) { ... }

当我触发 API 时:

GET http://localhost:8080/department/102/employee//workLogs --> 保持employeeId 为空白,此调用将映射到第一个GetMapping (func1),employeeId 计算为employeeId = "workLogs"

因此,对于标记为必需且调用完成并以 200 OK 完成的缺少路径变量不会引发异常。

如何解决这个问题,使其正确映射到 func2,并因缺少所需的路径变量而引发异常。

【问题讨论】:

  • 这是无法理解的,但是你怎么能期望得到基于空白员工ID的工作日志呢?无论如何,要避免这种问题,只需为/worklog/{employeeId} 创建一个带有getMethod的新Worklog控制器@
  • 不,我不希望在空白的employeeId 上获得workLogs。我预计这里会抛出异常,因为缺少所需的路径参数@JAsgarov

标签: java spring-boot api exception controller


【解决方案1】:

当您提出请求时 http://localhost:8080/department/102/employee/workLogs 这将被解释为 workLogs 作为员工 ID 提供。

有几种方法可以解决这个问题。

  • func1 中,如果employeeId.equals("workLogs") 则抛出异常
  • 将employeeId设置为Int或Long,这样当workLogs被尝试解析为employeeId时默认会抛出异常

但实际上,使用双斜杠 (//) 调用 http://localhost:8080/department/102/employee//workLogs 应该会导致 404 错误。如果不是这种情况,请尝试使用 Spring 5.3.15 版本。

【讨论】:

  • 如何在build.gradle中添加这个版本?
  • 您可以查看gradle reference,或发布您的 gradle 文件的副本,我会为您提供帮助
  • 当我将“id 'org.springframework.boot' version '2.4.5'”设为5.3.15,并构建gradle文件时,找不到这个版本。
猜你喜欢
  • 2020-03-19
  • 2016-09-17
  • 2015-07-09
  • 1970-01-01
  • 2012-11-04
  • 2018-03-18
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
相关资源
最近更新 更多