Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring矩阵变量至少需要一个模板变量才能工作?_Spring_Rest - Fatal编程技术网

Spring矩阵变量至少需要一个模板变量才能工作?

Spring矩阵变量至少需要一个模板变量才能工作?,spring,rest,Spring,Rest,我一直在尝试获取一个简单的RESTAPI来列出集合的内容,并使用矩阵变量来控制分页 My controller使用以下方法列出集合的内容: @RequestMapping( value = "articles", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody ArticlePageRestApiResponse listArticl

我一直在尝试获取一个简单的RESTAPI来列出集合的内容,并使用矩阵变量来控制分页

My controller使用以下方法列出集合的内容:

@RequestMapping(
    value = "articles",
    method = RequestMethod.GET,
    produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ArticlePageRestApiResponse listArticles(
    @MatrixVariable(required = true, defaultValue = 100, value = "resultsPerPage") int resultsPerPage,
    @MatrixVariable(required = true, defaultValue = 0, value = "pageNumber") int pageNumber) {

    // some logic to return the collection

}
如果我接着执行GET,它将无法找到请求映射。我通过添加以下内容启用了矩阵变量支持:

@Configuration
public class EnableUriMatrixVariableSupport extends WebMvcConfigurationSupport {

    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping hm = super.requestMappingHandlerMapping();
        hm.setRemoveSemicolonContent(false);
           return hm;
    }
}
我发现,如果矩阵变量的前缀至少有一个模板变量,那么矩阵变量的赋值就正确了。下面的方法很有效,但很难看,我不得不将URI路径的一部分设置为模板变量,该模板变量始终是“articles”,以诱使请求映射处理程序认为至少存在一个URI模板变量:

@RequestMapping(
    value = "{articles}",
    method = RequestMethod.GET,
    produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ArticlePageRestApiResponse listArticles(
    @PathVariable("articles") String ignore,
    @MatrixVariable(required = true, defaultValue = 100, value = "resultsPerPage") int resultsPerPage,
    @MatrixVariable(required = true, defaultValue = 0, value = "pageNumber") int pageNumber) {

    // some logic to return the collection
}

我是否发现了一个bug或是我对矩阵变量的理解有误?

根据Spring文档

如果URL预期包含矩阵变量,则请求映射 模式必须用URI模板表示它们。这确保了 无论矩阵是否匹配,请求都可以正确匹配 变量是否存在以及它们的提供顺序

在第一个示例中,URL映射中没有使用模板(如{articles}),因此Spring无法检测矩阵参数。
我宁愿把它称为一个错误,而是一个实施的副作用。我们之所以拥有它,是因为@MatrixVariable支持是在旧的@PathVariable解析机制的基础上构建的。

从技术上讲,
/articles
是否仍然是一个URI模板,但没有URI模板变量?因此,在Spring doco中更清楚地说,如果一个URL预期包含矩阵变量,那么请求映射模式必须用至少一个URI模板变量的URI模板来表示它们