【发布时间】:2019-07-02 14:59:36
【问题描述】:
由于过去的设计方式,在这种情况下,为名为@987654321@ 的特定参数创建了一个端点。
但是,该要求意味着端点可以与foo 或称为bobby 的新参数一起使用。
在尝试整合到一个端点之后,重构工作太多了。
所以我选择重载端点并使用 spring boot 技巧让签名由请求参数决定。
像这样:
@GetMapping(params = {"foo"})
public CollectionResource<FooResource> get(@RequestParam("foo") String foo, ...) {} ...
@GetMapping(params = {"bobby"})
public CollectionResource<FooResource> get(@RequestParam("bobby") {} ...
这样在与端点交互时效果很好:
localhost:8080/testEndpoint?foo=bar
localhost:8080/testEndpoint?bobby=tables
但是,我在尝试以下操作时发现了一个极端情况:
localhost:8080/testEndpoint?bobby=tables&foo=bar
这会引发以下运行时异常
java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8080/testEndpoint/':
此端点不是由用户点击而是以编程方式命中,因此这种情况发生的可能性非常小。但是,有没有办法设置控制器,以便它可以处理这个问题并抛出一个 BadRequest 等而不是炸毁?
Spring Boot 版本:1.5.16.RELEASE
【问题讨论】:
标签: java spring spring-boot spring-restcontroller ambiguous