Избегайте неоднозначных методов обработчика, отображаемых для пути HTTP с помощью Regex

У меня есть аналогичные контроллеры ONe получить по идентификатору, а другой получить по имени как с использованием PathVariables, я прочитал статью, в которой объяснялось и как разрешить с помощью регулярного выражения, но, похоже, она не работает должным образом

 @GetMapping(value = "/trucks/{truckId:[0-9]+}")
    @ResponseStatus(HttpStatus.FOUND)
    @ResponseBody
    public final TruckDto getTruckId(@PathVariable(value = "truckId")
                                         final String truckId) {

        LOGGER.debug("test: truckId({})", truckId);
        Truck truck = truckService.getTruckById(Integer.parseInt(truckId));
        return mappingService.map(truck, TruckDto.class);
    }

    /**
     * @return Truck with an average.
     */
    @ResponseStatus(HttpStatus.FOUND)
    @ResponseBody
    @GetMapping(value = "/trucks/{truckCode:[a-zA-Z0-9]+}")
    public final TruckWithAvgPetrolDto getTruckByTruckCode(@PathVariable(value = "truckCode")
                                                     final String truckCode) {

        LOGGER.debug("test: getTruckByTruckCode({})", truckCode);

        TruckWithAvgDto truck = truckService.getTruckByTruckCode(truckCode);

        return mappingService.map(truck, TruckWithAvgPetrolDto.class);
    }

Без установки регулярного выражения оба не пройдут мой тест, но после установки регулярного выражения метод getTruckByTruckCode, который принимает числа и буквы, проходит, но получает по truckId, по-прежнему дает метод неоднозначного обработчика ошибок

Очевидно, что число соответствует обоим регулярным выражениям, поэтому сопоставление getTruckId является неоднозначно.

Uwe Voigt 21.04.2018 05:56

ох, но я подумал, что, поскольку он может принимать как цифры, так и буквы, он должен отличаться от других, но каков дальнейший путь?

valik 21.04.2018 06:04

Предположительно, код грузовика не может быть чистыми цифрами, потому что в противном случае вы могли бы узнать, является ли последовательность цифр id или code. Таким образом, регулярное выражение кода не должно соответствовать числовому значению, например {truckCode:[0-9]*[a-zA-Z][a-zA-Z0-9]*}, т.е. необязательные начальные цифры, нецифровые, а затем любой набор допустимых символов. --- Теперь, если код может представляет собой чистые цифры, вам нужно изменить путь, например /trucks/5 будет от id, но /trucks/code/5 будет от code.

Andreas 21.04.2018 06:05

мой truckCode обычно начинается с двух букв BY3432, например

valik 21.04.2018 06:06

Однако вы нарушаете принципы REST. Грузовик - это ресурс с единственным уникальным URL-адресом: /trucks/{id}. Для поиска грузовика по другим значениям используется запрос, поэтому /trucks/?code = {code} будет более подходящим URL для этого.

Andreas 21.04.2018 06:07
"Обычно"? Это не правило. Правило должно охватывать все возможные значения.
Andreas 21.04.2018 06:07

да, но truckCode также является уникальным значением в моей базе данных? по-прежнему нецелесообразно использовать отдельный метод для получения по truckCode?

valik 21.04.2018 06:09

Это связано с тем, что мой get by id просто получает данные о грузовике, но мой get by truckCode выполняет соединение и получает информацию о грузовике плюс и среднее значение из второй таблицы

valik 21.04.2018 06:11

@ Андрей, что ты думаешь

valik 21.04.2018 06:15

Как вы сами сказали, get by id - это просто информация о грузовике, то есть сам грузовик ресурс, а get by truckCode возвращает «отчет» о результате запроса. Тот факт, что запрос возвращает только один объект грузовика, не означает, что это не запрос.

Andreas 21.04.2018 06:19

поэтому мой URL-адрес должен быть чем-то вроде / trucks / {id} / code, где код является необязательным параметром? @Andreas

valik 21.04.2018 06:24

Я привел два примера, ни один из них не был таким. Но эй, это твой код. Ты можешь делать что захочешь.

Andreas 21.04.2018 06:27

да, я не понял ваш пример, я хочу сделать это правильно, не могли бы вы объяснить лучше, я хочу следовать правильному принципу, спасибо @Andreas

valik 21.04.2018 06:29

Я сказал, что вы можете попробовать /trucks/code/BY3432 или еще лучше /trucks/?code=BY3432. Что вы в этом не понимаете?

Andreas 21.04.2018 08:23

хорошо, спасибо, я должен сделать код просто необязательным параметром,

valik 21.04.2018 14:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
15
189
0

Другие вопросы по теме