2012-02-08 45 views
1

我正在寻找一种方法来获得复杂的URL映射,这将取决于数据库的内容。比如我显示两个URL映射:Spring MVC:基于高级注解的映射

/{category}/ 
    /{category}/{slug}/{id} 

类别例如可以是:

apples, pears, lemons -> resolve to FruitListController, 
    beans, onions, potatoes -> resolve to VegetableListController. 
  • 注意,这些类别存储在数据库中,并可能会改变。

如果我有另外的slug和id,他们都必须检查对数据库,如果他们存在。

我可以以某种方式编写某种“类别处理程序”,它会返回相应的类别和关联的控制器?

显然这是一个翻译的问题URL - >请求。另外,有没有一种方法可以以类似的方式向后生成请求 - > URL?我想喜欢在模板中的东西:

<c:foreach="apples as apple" 
     <a href="${link AppleController:defaultView, ID = apple.id}">${apple.name}</a> 
    </c:foreach> 

回答

2

使用WebArgumentResolvers。他们可以访问WebRequest以查看您的网址。解析器可以执行数据库查找。 FruitWebArgumentResolver可以返回一个Fruit或返回UNRESOLVED。 VegetableArgumentResolver可能会返回蔬菜或返回UNRESOLVED。参数解析后,处理程序适配器可以映射到将特定类型作为参数的RequestMapping。例如,

@RequestMapping("/{catagory}/{slug}") 
public void fruitSlugList(Fruit fruit, @PathVariable("slug") String slug){ 

要看到这样的一个例子,我这​​里有一个博客帖子使用相同类型的机制: http://www.adamweigold.com/2012/01/using-multpartrequestresolvers-with.html

+0

感谢您的解决方案,尽管我不知道怎么的博客帖子被连接到我的问题。是否有可能以这种方式定义可选参数?我一直在考虑为给定的Control:view生成URL - 它是否提供了一些工具来生成它们? – 2012-02-09 19:48:38

+0

我不确定你的意思是“生成URL”。就可选参数而言,如果它们是RequestParams,则它们可以是可选的。 博客文章仅显示了正在使用的ArgumentResolver的示例。 如果解决方案好,请接受答案(复选标记)。 – aweigold 2012-02-09 20:38:24