有没有办法表示我的 Spring Web MVC Controller 方法应该通过将 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) {
在我看来,这似乎是一个非常常见的现实世界 URL 方案,我不想添加重复的代码,但我还没有找到答案。任何建议都非常受欢迎。
编辑:事实证明,目前似乎(使用 Spring MVC <= 3.0)没有办法实现这一点,请参阅 Javi 答案中的讨论。
最佳答案
您可以为同一个函数设置映射 url 并将 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 时它也会映射,但你可以在方法内部控制它。
EDIT:之前的解决方案不起作用,因为在没有的情况下
并且它无法映射 URL(感谢 ngeek)。我认为唯一可能的解决方案是创建两个方法,每个方法都使用其 @PathVariable
没有设置为null
{ null}@MappingRequest
映射,其中一个调用另一个函数或重定向到另一个 URL(重定向:或转发:Spring 前缀)。我知道这个解决方案不是您想要的,但认为这是您能做的最好的。实际上,您不是在复制代码,而是在创建另一个函数来处理另一个 URL。
关于java - Spring Web MVC : Use same request mapping for request parameter and path variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2745471/