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