Как иметь в Spring DeleteMapping, которая удаляет на основе разных типов переменных пути? - PullRequest
3 голосов
/ 11 июля 2020

Я пытаюсь создать приложение REST в Spring, где у меня есть требование удалить ресурсы на основе определенных переменных пути.

Например, я хочу удалить ресурсы по идентификатору

@DeleteMapping("resources/{id}")

или по имени

@DeleteMapping("resources/{name}")

Но когда я делаю это, я получаю сообщение об ошибке

java.lang.IllegalStateException: Ambiguous handler methods

Насколько я понимаю, сервлеты не могут определить, 123 в пути /resources/123 представляет собой идентификатор или имя и, следовательно, неоднозначность.

Как мне тогда разработать свою конечную точку REST, в которой УДАЛЕНИЕ происходит на основе некоторого параметра или, возможно, комбинации параметров?

Ответы [ 3 ]

1 голос
/ 11 июля 2020

Для удаления по id сопоставление отлично с использованием переменной пути

@DeleteMapping("resources/{id}")

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

@DeleteMapping("resources")
public ResponseEntity<?> delete(@RequestParam(value = "name") String name) {

Или вы можете возьмите как id, так и name в качестве параметра запроса, если вы хотите сопоставить обе операции одним методом в контроллере.

0 голосов
/ 11 июля 2020

Spring не может различить guish между двумя запросами, поскольку ваше сопоставление неоднозначно.

Вы можете попробовать использовать параметр запроса для второго запроса. Таким образом, это может выглядеть следующим образом:

 @DeleteMapping("/hello/{id}")
 public String deleteById(@PathVariable("id") Long id) {
    return "Delete by id called";
 }


  @DeleteMapping("/hello")
  public String deleteByName(@RequestParam(value = "name") String name) {
    return "Delete by name called";
  }

Запросы типа DELETE http://localhost: 8080 / hello / 1 будут обрабатываться с помощью deleteById

Запросы типа DELETE http://localhost: 8080 / hello? name = deleteMe будет обрабатываться с помощью deleteByName.

Или вы можете добавить параметр запроса имени в тот же метод, и если ваш параметр запроса не равен нулю, вы можете удалить его по имени.

0 голосов
/ 11 июля 2020

Похоже, у вас есть два варианта:

  1. Используйте только одно отображение и устраните неоднозначность запроса в коде вашего контроллера. Например, попробуйте проанализировать параметр пути как целое число или сопоставить его с каким-то шаблоном.
  2. Используйте регулярное выражение в шаблоне пути, например @DeleteMapping("resources/{id:[0-9]+}") См. Spring Docs - Request Mapping URI Patterns для подробности. Это предполагает, что вы можете отличить идентификатор от имени с шаблоном.
...