4

我一直在尝试获取一个简单的 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 路径的一部分作为模板变量,该变量总是“文章”,以欺骗请求映射处理程序认为至少有一个 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
}

我发现了一个错误还是我误解了矩阵变量?

4

1 回答 1

1

根据 Spring 文档

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

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

于 2013-06-20T04:18:43.457 回答