为使映射正确工作,捕获 URI 变量 {id} 的名称必须与 @PathVariable 成员参数 String id 相同。
@GetMapping("/{id}")
public Object id(@PathVariable Long id) {
return id ;
}
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 ;
}
}
2.4 多个URI变量
你也可以定义多个 @PathVariable 注解来访问捕获的 URI 变量。
@GetMapping("/{cate}/{id}")
public Object category(@PathVariable String cate, @PathVariable Long id) {
return cate + "@" + id ;
}
@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 ;
}
2.7 可选的路径变量
默认情况下@PathVariable路径变量是必须,否则服务端将MethodArgumentTypeMismatchException异常。我们除了可以通过设置PathVariable注解的required属性为false外,还可以通过Optional类型接收值,如下示例:
@GetMapping({"/users/{id}", "/users/"})
public Object byId(@PathVariable Optional<Long> id) {
return id.orElseGet(() -> -1L) ;
}
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) ;
}