当前位置:  开发笔记 > 编程语言 > 正文

Is it possible to map a nested mapping in spring-mvc to a global path?

如何解决《Isitpossibletomapanestedmappinginspring-mvctoaglobalpath?》经验,为你挑选了1个好方法。

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?



1> Blazerg..:

请求的内容是不可能的,因为您无法避免在类级别上的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 也是一个推荐的方法只需将不适合您的控制器“通用逻辑”的方法移到另一个控制器类,这是有意义的,因为该方法不受控制器通用逻辑的影响。


我强烈反对第一种方法。它将打开您不期望也不想要的URL,这是一个主要的安全问题/代码异味
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有