SpringBoot2内使用@MatrixVariable注解时的注意事项

SpringBoot配合@MatrixVariable注解使用时的注意事项

  1. @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,这样我们就可以完成定制,重新开始测试发现可以正常工作了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值