我正在阅读有关Spring文档Spring Doc中的@Matrixvariable批注

我已经了解了这种简单的语法
// GET / pets / 42; q = 11; r = 22

@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET)
public void findPet(@PathVariable String petId, @MatrixVariable int q) {

  // petId == 42
  // q == 11

}


但在理解以下代码段时遇到问题

// GET /owners/42;q=11;r=12/pets/21;q=22;s=23

@RequestMapping(value = "/owners/{ownerId}/pets/{petId}", method = RequestMethod.GET)
  public void findPet(
        @MatrixVariable Map<String, String> matrixVars,
        @MatrixVariable(pathVar="petId"") Map<String, String> petMatrixVars) {

    // matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
    // petMatrixVars: ["q" : 11, "s" : 23]

  }


这是什么语法@MatrixVariable(pathVar =“ petId”“)
我不了解Matrixvariable注释的pathVar属性吗?

这行对我来说// matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]可以确定,此变量已添加所有矩阵变量。
 但是,将petMatrixVars与这些特定值相加意味着

//petMatrixVars: ["q" : 11, "s" : 23]  ? why not  //petMatrixVars: ["q" : 22, "s" : 23]  ?


在此先感谢您花费在此线程上的时间!!

最佳答案

这称为Partial Binding,用于从该路径段中的该段获取所有变量,或者如果要从该路径段docs中获取每个变量,则本文档here中的输出错误。

在您的示例中,您将获得petId {21}之后路径中的所有变量

// GET /owners/42;q=11;r=12/pets/21;q=22;s=23
 @MatrixVariable(pathVar="petId") Map<String, String> petMatrixVars)


如果您只想在q段之后获取petId,则

@MatrixVariable(value ="q",pathVar="petId") int q


这是带有输出的示例,对于@MatrixVariable,我们需要首先启用它们

import org.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.util.UrlPathHelper;

 @Configuration
 public class WebConfig implements WebMvcConfigurer {

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    UrlPathHelper urlPathHelper = new UrlPathHelper();
    urlPathHelper.setRemoveSemicolonContent(false);
    configurer.setUrlPathHelper(urlPathHelper);
  }
}


具有@requestmapping方法的控制器

@RequestMapping(value = "/owners/{ownerId}/pets/{petId}", method = RequestMethod.GET)
  public void findPet(
        @MatrixVariable Map<String, String> matrixVars,
        @MatrixVariable(pathVar="petId") Map<String, String> petMatrixVars) {
    System.out.println(matrixVars);
     System.out.println(petMatrixVars);

  }
}


要求:http://localhost:8080/sample/owners/42;q=11;r=12/pets/21;q=22;s=23

输出:

{q=11, r=12, s=23}
{q=22, s=23}


如果我更改@MatrixVariable Map<String, List<String>> matrixVars,
输出是

{q=[11, 22], r=[12], s=[23]}
{q=22, s=23}

10-06 06:39