别不信@PathVariable你真不会用

开发 前端
从Spring的某个版本开始这个后缀已经被声明过时不建议再使用了,配置文件中对应的参数都删除了,所以目前你只能通过自定义WebMvcConfigurer方式开启后缀匹配。

1. 简介

@PathVariable是Spring MVC中的一个非常重要的注解,作用在于将URL中的模板变量(即路径变量)绑定到控制器方法的参数上。这一功能特别适用于处理RESTful风格的请求,使得开发者能够直接从URL中提取参数值,并将其传递给方法进行处理。通过使用@PathVariable注解,可以设计出更加灵活和动态的URL映射,同时简化参数传递的过程,提高代码的可读性和可维护性。

接下来,我将深入解析@PathVariable注解的多种使用方式,展示其在实际开发中的灵活性和强大功能。看看你都掌握了几种应用技巧。

2. 实战案例

2.1 基本使用

为使映射正确工作,捕获 URI 变量 {id} 的名称必须与 @PathVariable 成员参数 String id 相同。

@GetMapping("/{id}")
public Object id(@PathVariable Long id) {
  return id ;
}

图片图片

如果将参数名修改如下:

@PathVariable Long key

这将导致错误

MissingPathVariableException: Required URI template 
  variable 'key' for method parameter type Long is not present]

所以,在这种情况下你参数的名称要与模板中的一样。

2.2 不同参数名

我们可以通过将参数传递给 @PathVariable 注解,显式访问捕获 URI 变量。

@GetMapping("/{id}")
public Object id(@PathVariable("id") Long key) {
  return key ;
}

通过指明路径参数名,这样就不会报错了。

2.3 类级别的路径变量

下面的示例展示了如何使用 @PathVariable 在类和方法级别访问URI 变量。

@RestController
@RequestMapping("/pv/{type}")
public class PathVariableController {


  @GetMapping("/{id}")
  public Object id(@PathVariable Integer type, @PathVariable("id") Long key) {
    return type + "@" +key ;
  }
}

这里的路径变量type与参数名一致所以不用指定名称。

2.4 多个URI变量

你也可以定义多个 @PathVariable 注解来访问捕获的 URI 变量。

@GetMapping("/{cate}/{id}")
public Object category(@PathVariable String cate, @PathVariable Long id) {
  return cate + "@" + id ;
}

只要你想,只要不超过GET请求大小限制,你可以设置N多的路径参数。

2.5 Map接收路径变量

@PathVariable注解还支持Map类型,如下示例:

@GetMapping("/api/{tag}/query/{name}")
public String getByTagAndName(@PathVariable Map<String, String> paths) {
  String tag = paths.get("tag");
  String name = paths.get("name");
  return tag + "@" + name ;
}

图片图片

2.6 正则路径变量

@GetMapping("/vk/api/{name:[a-z]+}")
public String getJarFile(@PathVariable String name) {
  return name ;
}

该路径将只会匹配最后的name为a~z组合的字符。

2.7 可选的路径变量

默认情况下@PathVariable路径变量是必须,否则服务端将MethodArgumentTypeMismatchException异常。我们除了可以通过设置PathVariable注解的required属性为false外,还可以通过Optional类型接收值,如下示例:

@GetMapping({"/users/{id}", "/users/"})
public Object byId(@PathVariable Optional<Long> id) {
  return id.orElseGet(() -> -1L) ;
}

匹配两个路径,没有id则返回-1。

2.8 路径后缀

关于路径后缀匹配,当你在应用中开启了后缀匹配时,如果路径参数中有后缀那么得到的结果将不会是你期望的,如下示例:

@GetMapping("/ext/api/{file}")
public Object fileExt(@PathVariable String file) {
  return new R(file) ;
}

请求结果:

图片图片

最终得到的值没有后缀,对于这种情况,你需要使用正则的方式处理,如下:

@GetMapping("/ext/api/{file:.+}")
public Object fileExt(@PathVariable String file)

通过这种方式后,你将会得到完整的后缀信息。

注:从Spring的某个版本开始这个后缀已经被声明过时不建议再使用了,配置文件中对应的参数都删除了,所以目前你只能通过自定义WebMvcConfigurer方式开启后缀匹配。

2.9 在非Controller中取得路径变量

通常请求的路径变量是在Controller层被捕获并处理的。如果你希望在Service层或其他非Controller组件中获取这些路径变量,而不是通过参数传递的方式,你则可以通过如下的方式。

private HttpServletRequest request ;
public void uriVar() {
  Map<String, String> vars = (Map<String, String>)request
    .getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE) ;
}

这将获取所有的路径变量数据。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2021-03-16 15:12:57

CompletableFuture机制java

2020-05-14 08:59:28

API网关性能

2020-09-01 14:17:03

WindowsDefender微软

2022-02-22 08:25:51

typeScript泛型概念泛型使用

2020-09-27 06:50:56

Java互联网注解

2019-09-03 09:30:46

ss 命令SocketLinux

2024-09-09 08:36:36

Java操作远程服务器

2020-12-18 09:45:33

DockerLinux命令

2020-08-26 14:40:38

explainMySQL数据库

2020-11-09 09:03:35

高并发多线程ThreadLocal

2012-05-02 15:38:49

金山快盘网盘

2020-03-10 08:33:04

HTTP演变协议

2020-12-07 09:15:00

JavaScript数组 reduce

2020-10-21 10:02:16

架构运维技术

2018-09-13 10:40:40

Linux命令find

2022-08-12 15:58:34

Docker

2019-11-28 16:48:00

华为Mate X

2015-04-14 10:54:34

Mac快捷键

2019-12-19 09:08:42

HTTP浏览器缓存

2020-09-21 10:50:24

Java多线程代码
点赞
收藏

51CTO技术栈公众号