SpringBoot配合@MatrixVariable注解使用时的注意事项
- @MatrixVariable注解详解
-
value属性表示将要接收的变量的名字,可以和name属性混用
-
name属性也表示接收的变量名字,可以和value属性混用
-
pathVar属性适用于特定的一些场景,即当我们的矩阵变量中有着相同的字段变量时,我们需要通过此属性区分它们。举个例子。
/cars/boss;age=20/employee;age=18
以上的路径中有两个变量名都是age,在客户端获取它们的值时,我们需要这样做:
@MatrixVariable(pathVar=“boss”,value=“age”),@MatrixVariable(pathVar=“employee”,value=“age”) -
required属性表示路径中是否一定需要带上该字段,默认值为true.
-
defaultValue属性可以为字段设置一个默认值。
2.配合SpringBoot使用
<a href="/company/boss;age=20;/employee;age=18">测试@MartixVariable注解的使用</a>
在客户端发送如下的请求,在服务器端我们这样写了这样一个方法来处理该请求:
@GetMapping("/company/{boss}/{employee}")
public Map sameMatrixTest(@MatrixVariable(value = "age",pathVar = "boss")Integer bossAge,
@MatrixVariable(value = "age",pathVar = "employee")Integer eAge){
System.out.println(bossAge);
System.out.println(eAge);
return map;
}
理论上我们只需要这样写就可以处理该请求了,但是实际上我们开启测试时,却出现了这样的错误。
说找不到age这样一个方法参数。但是我们不是已经在请求路径里面带上了吗?追根溯源,我们还是进入源码底层进行探究。
SpringBoot的最大特性就是按需装配和自定义组件,而Web开发场景需要的组件大都在WebMvcAutoConfiguration里面配置。
@Override
@SuppressWarnings("deprecation")
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(this.mvcProperties.getPathmatch().isUseSuffixPattern());
configurer.setUseRegisteredSuffixPatternMatch(
this.mvcProperties.getPathmatch().isUseRegisteredSuffixPattern());
this.dispatcherServletPath.ifAvailable((dispatcherPath) -> {
String servletUrlMapping = dispatcherPath.getServletUrlMapping();
if (servletUrlMapping.equals("/") && singleDispatcherServlet()) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setAlwaysUseFullPath(true);
configurer.setUrlPathHelper(urlPathHelper);
}
});
}
找到这样一个解析路径匹配的方法,在这个方法里面我们又注意到一个名为UrlPathHelper的类。实际上就是这个类的 removeSemicolonContent属性被设置为true了,这样就会把分号后面的内容全部忽略,所以我们才不能解析到矩阵变量age的值。
知道原因之后,根据SpringBoot的特性,我们要自定义组件可以采取多种方式,而我接下来采用的这一种是定制WebMvcConfiger的方法,当然也可以让我们的配置类实现WebMvcConfiger接口,但是这样耦合性增大了,个人不推荐。
@Configuration(proxyBeanMethods = false)
public class WebConfig /*WebMvcConfigurer */{
@Bean
public WebMvcConfigurer webMvcConfigurer(){
WebMvcConfigurer webMvcConfigurer=new WebMvcConfigurer() {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
};
return webMvcConfigurer;
}
}
重写其configyrePathMatch方法,添加UrlPathHelper组件设置removeSemicolonContent属性的值为false,这样我们就可以完成定制,重新开始测试发现可以正常工作了。