Сигнатура параметра конечной точки загрузки, выдает неоднозначное исключение конечной точки, когда оба параметра заданы - PullRequest
1 голос
/ 02 июля 2019

Из-за способа, которым он был спроектирован в прошлом, была создана одна конечная точка для определенного параметра, в данном случае называемая 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

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

Почему бы не выбрать первичную конечную точку?

Для начала просто добавьте к нему дополнительный параметр

 public CollectionResource<FooResource> get(@RequestParam("foo") String foo, ...
  ,@RequestParam("bobby")) {

По этой первой конечной точке в этом угловом случае будет выбран

1 голос
/ 02 июля 2019

Spring не может различить конечные точки на основе параметра запроса.

Вместо двух конечных точек для обслуживания двух параметров запроса, иметь только одну конечную точку с двумя параметрами запроса. У вас есть возможность сделать это не обязательным.

@RequestParam("foo") String foo required = false, @RequestParam("bobby") String foo required = false

Это упрощает работу с API

.
0 голосов
/ 02 июля 2019

попробуйте с обработчиками исключений

 @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
        List<String> details = new ArrayList<>();
        details.add(ex.getLocalizedMessage());
        ErrorResponse error = new ErrorResponse("Server Error", details);
        return new ResponseEntity(error, HttpStatus.BAD_REQUEST);
    }
...