Возможно ли отобразить вложенное отображение в spring-mvc на глобальный путь? - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть что-то вроде этого:

@RestController
@RequestMapping("/{id}")
public class MyController {
    @GetMapping
    public String get(@PathVariable String id) {
        ...
    }

    @PostMapping
    public String post(@PathVariable String id, Payload payload) {
        ...
    }

    @GetMapping("/deeper/{id}")
    public String getDeeper(@PathVariable String id) {
        ....
    }
}

Это дает 3 отображения:

  • / {id} (GET)
  • / {id} (POST)
  • / {id} / глубже / {id} (GET)

Я бы хотел, чтобы третий из них был просто /deeper/{id} (GET).

Возможно ли сделать это, оставив метод в том же контроллере и оставив эту пометку @RequestMapping для контроллера?

1 Ответ

7 голосов
/ 29 апреля 2019

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

Имейте в виду, что RestController имеет тип RESTful и используется requestMapping уровня класса, чтобы избежать добавления одного и того же пути ресурса к каждому методу, поэтому нет смысла иметь метод, который не может вписаться в этот ресурс (вы вместо этого следует переместить его на другой контроллер).

Как говорится, есть несколько вещей, которые вы можете попробовать:

1 Это не рекомендуется. Используйте более одного значения пути для вашего класса @ResquestMapping, в вашем случае:

@RestController
@RequestMapping("/{id}", "/")
public class MyController{...}

Вы можете добиться того, чего хотите, с этим, но это чрезвычайно обескураживает и пахнет кодом, потому что в основном означает, что все ваши методы будут принимать пути URL либо начиная с id, либо с /, подумайте внимательно, если вы хотите использовать этот подход.

2 Рекомендуемый . Удалите @RequestMapping на уровне класса и просто обновите путь для каждого метода, в вашем случае:

@RestController
public class MyController {
    @GetMapping(value = /{id})
    public String get(@PathVariable String id) {
        ...
    }

    @PostMapping(value = "/{id}")
    public String post(@PathVariable String id, Payload payload) {
        ...
    }

    @GetMapping("/deeper/{id}")
    public String getDeeper(@PathVariable String id) {
       ....
    }
    }

3 также рекомендуется Просто переместите метод, который не вписывается в "общую логику" вашего контроллера, в другой класс контроллера, который имеет смысл, поскольку на этот метод не влияет общая логика контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...