I have something like this:
@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) { .... } }
This gives 3 mappings:
/{id} (GET)
/{id} (POST)
/{id}/deeper/{id} (GET)
I would like the third of them to be just /deeper/{id} (GET)
.
Is it possible to do this leaving the method in the same controller and leaving that controller-wise @RequestMapping
annotation?
请求的内容是不可能的,因为您无法避免在类级别上的requestMapping,这是没有意义的,因为在类级别上意味着您希望该路径影响所有方法。
请记住,RestController是RESTful的,并且使用类级别的requestMapping来避免向每个方法添加相同的资源路径,因此,拥有一个不适合该资源的方法是没有意义的(应该将其移动)改为另一个控制器)。
话虽这么说,您可以尝试以下几种方法:
1 不建议这样做。@ResquestMapping
在您的情况下,请在您的类上使用多个路径值:
@RestController @RequestMapping("/{id}", "/") public class MyController{...}
您可以通过此方法实现所需的功能,但是不建议这样做,并且避免产生代码异味,因为基本上意味着您的所有方法都将接受以id或/开头的url路径,请仔细考虑是否要使用此方法。
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 也是一个推荐的方法只需将不适合您的控制器“通用逻辑”的方法移到另一个控制器类,这是有意义的,因为该方法不受控制器通用逻辑的影响。