我如何区分两个端点,每个端点都有一个 PathVariable?

How do i differentiate between two endpoints, each with one PathVariable?

我正在开发 Spring 启动应用程序。我有以下 REST 端点:

 @GetMapping(value = { "/person/{name}", "/person/{age}" })
 public PersonData getPersonData(@PathVariable(required = false) String name,
                                 @PathVariable(required = false) Integer age) {

}

可以使用名称变量或年龄变量调用此端点,但看起来无法区分它们。如果我调用'.../person/20',它不会调用“/person/{age}”,但它总是调用“/person/{name}”。

我知道我可以做类似的东西:

@GetMapping(value = { "/person/name/{name}", "/person/age/{age}" })

但是有没有其他方法可以在不向路径添加任何内容的情况下解决它?

路径变量通常类似于主键。

喜欢:

/person/{id}

您尝试的是搜索数据,这应该使用查询参数来完成。

示例:

@GetMapping(value = { "/person/{name}", "/person/{age}" })
public PersonData getPersonData(@RequestParam String name,
                                @RequestParam Integer age) {

}

然后就可以调用了

/person?age=40
/person?name=Peter

agename 在逻辑上 不是 同一事物;选择的最佳答案正确地建议将它们保留为可区分的参数。

但是您可以检查该值是否为数字并将其视为 age

@GetMapping("/person/{value}")
public String getPerson(@PathVariable String value) {
    if (value.matches("[0-9]|[0-9][0-9]"))
        return "Age";
    else
        return "Name";
}

但这是模棱两可且容易出错的(例如,添加其他数字参数时如何区分 shoeSizenumberOfPartners?)。

在您的情况下,我会制作 2 个不同的端点以更加清晰,每个端点都需要提供自己的查询参数。

 @GetMapping(value = "/person")
 public PersonData getPersonDataByName(@RequestParam(required = true) String name) {
 ....
}


 @GetMapping(value = "/person")
     public PersonData getPersonDataByAge(@RequestParam(required = true) Integer age) {
 ....   
    }

required = true 可以从注释中省略,因为这是默认值,我用它只是为了指出每个端点将仅针对该特定查询参数实现