有没有办法表明我的Spring Web MVC控制器方法应该通过将ID作为URI路径的一部分交付的请求来匹配...
@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {
...或者如果客户端将ID作为样式中的HTTP请求参数发送...
@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {
在我看来,这是一个非常常见的真实网址方案,我不想添加重复的代码,但我还没有找到答案。任何建议都非常欢迎。
编辑:事实证明目前似乎(使用Spring MVC< = 3.0)无法实现这一目标,请参阅Javi答案中的讨论。
答案 0 :(得分:50)
您可以为同一功能设置映射网址,并将ID设置为可选。
@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
public String getCampaignDetails(Model model,
@RequestParam(value="id", required=false) Long id,
@PathVariable("id") Long id2)
{
}
虽然在没有发送id的情况下它也会映射,但你可以在方法中控制它。
编辑:之前的解决方案不起作用,因为@PathVariable
未设置为null
时没有设置{null}
且无法映射网址(感谢ngeek)。我认为唯一可行的解决方案是创建两个方法,每个方法用@MappingRequest
映射,其中一个方法调用另一个函数或重定向到另一个URL(重定向:或转发:弹簧前缀)。我知道这个解决方案不是你想要的,但认为这是你能做的最好的。实际上,您并没有复制代码,但是您正在创建另一个函数来处理另一个URL。
答案 1 :(得分:4)
如果你仍然想坚持使用PathVariable方法,如果你得到400语法不正确的错误,那么请遵循这种方法 -
@RequestMapping(method=RequestMethod.GET, value={"campaigns/{id}","campaigns"})
public String getCampaignDetails(Model model,
@PathVariable Map<String, String> pathVariables)
{
System.out.println(pathVariables.get("id"));
}
答案 2 :(得分:2)
@RequestMapping
注释现在支持设置path
属性,而不是name
或value
。使用path
,您可以实现此问题所需的映射:
@RequestMapping(method=RequestMethod.GET, path="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {
@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {