@PathVariable是Spring MVC中的一个非常重要的注解,作用在于将URL中的模板变量(即路径变量)绑定到控制器方法的参数上。这一功能特别适用于处理RESTful风格的请求,使得开发者能够直接从URL中提取参数值,并将其传递给方法进行处理。通过使用@PathVariable注解,可以设计出更加灵活和动态的URL映射,同时简化参数传递的过程,提高代码的可读性和可维护性。
接下来,我将深入解析@PathVariable注解的多种使用方式,展示其在实际开发中的灵活性和强大功能。看看你都掌握了几种应用技巧。
为使映射正确工作,捕获 URI 变量 {id} 的名称必须与 @PathVariable 成员参数 String id 相同。
@GetMapping("/{id}")publicObject id(@PathVariableLong id){returnid;}
图片
如果将参数名修改如下:
@PathVariableLongkey
这将导致错误
MissingPathVariableException: Required URI template variable'key'formethod parametertypeLongisnotpresent]
所以,在这种情况下你参数的名称要与模板中的一样。
我们可以通过将参数传递给 @PathVariable 注解,显式访问捕获 URI 变量。
@GetMapping("/{id}")publicObject id(@PathVariable("id")Longkey){returnkey;}
通过指明路径参数名,这样就不会报错了。
下面的示例展示了如何使用 @PathVariable 在类和方法级别访问URI 变量。
@RestController@RequestMapping("/pv/{type}")publicclass PathVariableController {@GetMapping("/{id}")publicObject id(@PathVariableIntegertype,@PathVariable("id")Longkey){returntype+"@"+key;} }
这里的路径变量type与参数名一致所以不用指定名称。
你也可以定义多个 @PathVariable 注解来访问捕获的 URI 变量。
@GetMapping("/{cate}/{id}")publicObject category(@PathVariableString cate,@PathVariableLong id){returncate+"@"+id;}
只要你想,只要不超过GET请求大小限制,你可以设置N多的路径参数。
@PathVariable注解还支持Map类型,如下示例:
@GetMapping("/api/{tag}/query/{name}")publicString getByTagAndName(@PathVariableMap<String,String>paths){ String tag=paths.get("tag");String name=paths.get("name");returntag+"@"+name;}
图片
@GetMapping("/vk/api/{name:[a-z]+}")publicString getJarFile(@PathVariableString name){returnname;}
该路径将只会匹配最后的name为a~z组合的字符。
默认情况下@PathVariable路径变量是必须,否则服务端将MethodArgumentTypeMismatchException异常。我们除了可以通过设置PathVariable注解的required属性为false外,还可以通过Optional类型接收值,如下示例:
@GetMapping({"/users/{id}","/users/"})publicObject byId(@PathVariableOptional<Long>id){returnid.orElseGet(()->-1L);}
匹配两个路径,没有id则返回-1。
关于路径后缀匹配,当你在应用中开启了后缀匹配时,如果路径参数中有后缀那么得到的结果将不会是你期望的,如下示例:
@GetMapping("/ext/api/{file}")publicObject fileExt(@PathVariableStringfile){returnnew R(file);}
请求结果:
图片
最终得到的值没有后缀,对于这种情况,你需要使用正则的方式处理,如下:
@GetMapping("/ext/api/{file:.+}")publicObject fileExt(@PathVariableStringfile)
通过这种方式后,你将会得到完整的后缀信息。
注:从Spring的某个版本开始这个后缀已经被声明过时不建议再使用了,配置文件中对应的参数都删除了,所以目前你只能通过自定义WebMvcConfigurer方式开启后缀匹配。
通常请求的路径变量是在Controller层被捕获并处理的。如果你希望在Service层或其他非Controller组件中获取这些路径变量,而不是通过参数传递的方式,你则可以通过如下的方式。
private HttpServletRequest request;publicvoid uriVar(){ Map<String,String>vars=(Map<String,String>)request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);}
这将获取所有的路径变量数据。