SpringBoot控制器映射到不正确的方法



我的控制器中有以下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,并为缺少所需的路径变量抛出异常。

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

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

  • func1中,如果employeeId.equals("workLogs"),则抛出异常
  • 将employeeId设置为Int或Long,以便在尝试将workLogs解析为employeeId时,默认情况下会引发异常

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

最新更新