我一直在尝试使用简单的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
}
我是否发现了一个错误,或者我是否误解了矩阵变量?
答案 0 :(得分:1)
根据Spring文档
如果URL预计包含矩阵变量,则请求映射 pattern必须用URI模板表示它们。这确保了 无论是否矩阵,请求都可以正确匹配 变量是否存在以及它们的提供顺序。
在第一个示例中,您在URL映射中不使用模板(如{articles}),因此Spring无法检测矩阵参数。 我宁可称它不是一个bug,而是一个实现副作用。我们之所以拥有它只是因为@MatrixVariable支持是在旧的@PathVariable解析机制的基础上构建的。