是否可以将spring-mvc中的嵌套映射映射到全局路径?

时间:2019-04-29 06:58:06

标签: java spring-mvc

我有这样的东西:

@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} / deeper / {id}(GET)

我希望其中的三分之一只是/deeper/{id} (GET)

是否可以将方法留在同一控制器中,并在控制器上使用@RequestMapping注释?

1 个答案:

答案 0 :(得分:7)

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