Из-за способа, которым он был спроектирован в прошлом, была создана одна конечная точка для определенного параметра, в данном случае называемая foo
.
Однако требование означало, что конечная точка может использоваться либо с foo
, либо с новым параметром с именем bobby
.
После попытки объединиться в одну конечную точку работа по рефакторингу оказалась слишком большой.
Поэтому я решил перегрузить конечную точку и использовать трюк с пружинной загрузкой, чтобы подпись определялась параметрами запроса.
Вроде так:
@GetMapping(params = {"foo"})
public CollectionResource<FooResource> get(@RequestParam("foo") String foo, ...) {} ...
@GetMapping(params = {"bobby"})
public CollectionResource<FooResource> get(@RequestParam("bobby") {} ...
Это хорошо работает при взаимодействии с конечными точками, например:
локальный: 8080 / testEndpoint Foo = бар
LOCALHOST: 8080 / testEndpoint Bobby = таблицы
Однако я обнаружил крайний случай, когда попробовал следующее:
локальный: 8080 / testEndpoint бобби = таблицы и Foo = бар
Который выдает следующее исключение времени выполнения
java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8080/testEndpoint/':
Эта конечная точка поражена не пользователями, а программно, поэтому вероятность такого случая очень мала. Однако есть ли способ настроить контроллер, чтобы он мог справиться с этим и просто выдать BadRequest и т. Д. Вместо взрыва?
Версия с пружинной загрузкой : 1.5.16.RELEASE