Spring - 通用请求映射处理程序的多个PathVariable值

时间:2014-11-07 14:18:37

标签: java spring rest

我试图实现一个分层分类树,它遵循结构

                                    term 1
                                    /    \
                                term 2  term 3
                                       /   |   \
                                 term 4 term 5  term 6

其中每个Term对象都包含一个包含其下方所有Term的集合。

传统上,使用网址

访问第三级术语
/term/chapter/section/paragraph 

春天RequestMapping将由

组成
@RequestMapping(value = "/term/{term1}/{term2}/{term3}", method = RequestMethod.GET)
public Term getTerm(@PathVariable("term1") Term rootTerm, 
                    @PathVariable("term2") Term childTerm,
                    @PathVariable("term3") Term leafTerm) {

  /* Processing code here */

  return Term;

}

这样做的缺点是它特别将分类树的高度限制为所请求URL的指定处理程序数。在这种情况下,我只限于高度为3的树。

是否有内置方法可将额外的Term网址标识符传递给方法,而不考虑子Term的数量?或者我是否必须在控制器中处理URL本身?

2 个答案:

答案 0 :(得分:0)

也许你可以使用一个参数进行解析。

而不是像这样指定一个网址:

/term/depth1/depth2/.../dephtN

您可以指定格式约定并查询您的术语,如下所示:

/term/depth1-depth2-...-depthN

然后在您的控制器中,您可以解析URL:

@RequestMapping(value = "/term/{query}", method = RequestMethod.GET)
public Term getTerm(@PathVariable String query) {

    // example access
    String[] parts = query.split("-");
    String chapterId = parts[0];
    String sectionId = parts[1];
    String paragraphId = parts[2];
    // ... to be continued

    /* Processing code here */

  return Term;
}

答案 1 :(得分:0)

我认为你不能用路径变量做到这一点。路径变量在REST URL中很好,前提是URL的systax是常量,并且您希望它可以扩展为任意数量的术语。

恕我直言,你必须回头要求参数。但幸运的是,Spring MVC非常友好地将索引参数自动转换为List。你可以这样做:

@RequestMapping(value = "/term", method = RequestMethod.GET)
public Term getTerm(@ModelAttribute TermPath termPath) {
//code
}

class TermPath {
    List<String> path;

    Term getTerm() { // extract the Term corresponding to the path
    ...
    }
    // getter and setter
}

并使用以下网址:/term?path[0]=chapter&path[1]=section&path[2]=paragraph...