Spring MVC中的可选路径段


问题内容

阅读2010年的这篇(spring3)文章,它讨论了如何使用扩展来提供方便的方式来包含可选路径段:

@RequestMapping("/houses/[preview/][small/]{id}")
public String handlePreview(@PathVariable long id, @PathVariable("preview/") boolean preview, @PathVariable("small/") boolean small) {
    return "view";
}

我知道我可以实现一些请求映射来达到相同的效果:

@RequestMapping(value="/houses/preview/{id}")
...

@RequestMapping(value="/houses/{id}")
...
~~~ snip ~~~

但是根据可能的排列数量,这似乎是一个非常冗长的选择。

Spring的更高版本(3之后)是否提供这种功能?另外,是否有任何机制可以将请求URL的各个部分链接起来以提供更大的响应方法签名?

更新资料

这个关于共享路径变量和请求参数的问题的答案提出了一种类似的方法:

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
    @ResponseBody
    public String getCampaignDetails(
         @PathVariable("id") String id)
    {
        ~~~ snip ~~~

但是path变量不能设置为null。只需/campaigns返回400响应。


问题答案:

java.util.Optional如果使用,为什么不使用Java 1.8。以后面的示例为例,您可以使用放置a
Optional<String>来避免出现400响应,而不是String像这样表示最终的路径:

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
@ResponseBody
public String getCampaignDetails(
     @PathVariable("id") Optional<String> id)
{ 
  if(id.isPresent()){
      model.addAttribute("id", id.get());//id.get() return your String path
  }
}