我试图实现一个分层分类树,它遵循结构
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本身?
答案 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...