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

时间:2013-06-20 00:22:53

标签: spring rest

我一直在尝试使用简单的REST API来列出集合的内容,并且我使用矩阵变量来控制分页。

我的控制器有以下列出集合内容的方法:

@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 http://example.com/articles;resultsPerPage=22;pageNumber=33,则无法找到请求映射。我通过添加以下内容启用了矩阵变量支持:

@Configuration
public class EnableUriMatrixVariableSupport extends WebMvcConfigurationSupport {

    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping hm = super.requestMappingHandlerMapping();
        hm.setRemoveSemicolonContent(false);
           return hm;
    }
}

我发现如果矩阵变量以至少一个模板变量为前缀,则矩阵变量被正确分配。下面的工作但很难看,我必须将URI路径的一部分作为一个模板变量,而这个模板变量总是会成为"文章"欺骗Request Mapping Handler认为至少有一个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
}

我是否发现了一个错误,或者我是否误解了矩阵变量?

1 个答案:

答案 0 :(得分:1)

根据Spring文档

  

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

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