У меня есть аналогичные контроллеры 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, по-прежнему дает метод неоднозначного обработчика ошибок
ох, но я подумал, что, поскольку он может принимать как цифры, так и буквы, он должен отличаться от других, но каков дальнейший путь?
Предположительно, код грузовика не может быть чистыми цифрами, потому что в противном случае вы могли бы узнать, является ли последовательность цифр id или code. Таким образом, регулярное выражение кода не должно соответствовать числовому значению, например {truckCode:[0-9]*[a-zA-Z][a-zA-Z0-9]*}, т.е. необязательные начальные цифры, нецифровые, а затем любой набор допустимых символов. --- Теперь, если код может представляет собой чистые цифры, вам нужно изменить путь, например /trucks/5 будет от id, но /trucks/code/5 будет от code.
мой truckCode обычно начинается с двух букв BY3432, например
Однако вы нарушаете принципы REST. Грузовик - это ресурс с единственным уникальным URL-адресом: /trucks/{id}. Для поиска грузовика по другим значениям используется запрос, поэтому /trucks/?code = {code} будет более подходящим URL для этого.
да, но truckCode также является уникальным значением в моей базе данных? по-прежнему нецелесообразно использовать отдельный метод для получения по truckCode?
Это связано с тем, что мой get by id просто получает данные о грузовике, но мой get by truckCode выполняет соединение и получает информацию о грузовике плюс и среднее значение из второй таблицы
@ Андрей, что ты думаешь
Как вы сами сказали, get by id - это просто информация о грузовике, то есть сам грузовик ресурс, а get by truckCode возвращает «отчет» о результате запроса. Тот факт, что запрос возвращает только один объект грузовика, не означает, что это не запрос.
поэтому мой URL-адрес должен быть чем-то вроде / trucks / {id} / code, где код является необязательным параметром? @Andreas
Я привел два примера, ни один из них не был таким. Но эй, это твой код. Ты можешь делать что захочешь.
да, я не понял ваш пример, я хочу сделать это правильно, не могли бы вы объяснить лучше, я хочу следовать правильному принципу, спасибо @Andreas
Я сказал, что вы можете попробовать /trucks/code/BY3432 или еще лучше /trucks/?code=BY3432. Что вы в этом не понимаете?
хорошо, спасибо, я должен сделать код просто необязательным параметром,




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