在 Spring 的 GetMapping 中使用参数会导致多个参数的处理程序方法不明确

Posted

技术标签:

【中文标题】在 Spring 的 GetMapping 中使用参数会导致多个参数的处理程序方法不明确【英文标题】:Using params in GetMapping in Spring results in ambiguous handler method for multiple parameters 【发布时间】:2020-11-01 08:30:36 【问题描述】:

我在 Spring boot 中有以下 REST 端点

@GetMapping(value = "students", params = "name")
public ResponseEntity<?> getByName(@RequestParam final String name) 
    return new ResponseEntity<>(true, HttpStatus.OK);


@GetMapping(value = "students", params = "tag")
public ResponseEntity<?> getByTag(@RequestParam final String tag) 
    return new ResponseEntity<>(true, HttpStatus.OK);

上述处理程序适用于以下请求:

localhost:8080/test/students?name="Aron"

localhost:8080/test/students?tag="player"

但是,每当我尝试以下操作时:

localhost:8060/test/students?name="Aron"&amp;tag="player"

它抛出 java.lang.IllegalStateException: Ambiguous handler methods mapped 并以 HTTP 500 响应

如何改变这种行为?我希望我的应用程序仅在我获得 tag 查询参数或 name 查询参数时响应。 对于其他任何事情,我希望它忽略 即使它是两个参数的组合

为什么会在这里抛出模棱两可的错误,我们该如何处理?

【问题讨论】:

你为什么不使用多种方法。使用单一方法将名称和标签都作为 requestparam 然后你可以处理这种情况 【参考方案1】:

看来您可以在参数中使用否定。比如:

@GetMapping(value = "students", params = "name", "!tag")
public ResponseEntity<?> getByName(@RequestParam final String name) 
    return new ResponseEntity<>(true, HttpStatus.OK);


@GetMapping(value = "students", params = "tag", "!name")
public ResponseEntity<?> getByTag(@RequestParam final String tag) 
    return new ResponseEntity<>(true, HttpStatus.OK);

参考资料: Advanced @RequestMapping options

【讨论】:

【参考方案2】:

你可以使用@RequestParam(required = false):

    @GetMapping(value = "students")
    public ResponseEntity<?> get(
        @RequestParam(required = false) final String name,
        @RequestParam(required = false) final String tag) 

        if ((name == null) == (tag == null)) 
            return new ResponseEntity<>(false, HttpStatus.BAD_REQUEST);
        
        return new ResponseEntity<>(true, HttpStatus.OK);
    

【讨论】:

以上是关于在 Spring 的 GetMapping 中使用参数会导致多个参数的处理程序方法不明确的主要内容,如果未能解决你的问题,请参考以下文章

Spring @GetMapping 被忽略

Spring Boot - GetMapping 到具有不同路径的相同方法的更简单方法

SpringMVC@RequestMapping和@GetMapping的区别

带有@RequestParam和@RequestBody的Spring @GetMapping因HttpMessageNotReadableException而失败

SpringMVC@RequestMapping和@GetMapping的区别

@RequestMapping 和 @GetMapping @PostMapping 区别