java - Spring Web MVC : Use same request mapping for request parameter and path variable

标签 java spring spring-mvc annotations

有没有办法表示我的 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:之前的解决方案不起作用,因为在没有的情况下@PathVariable没有设置为null{ null} 并且它无法映射 URL(感谢 ngeek)。我认为唯一可能的解决方案是创建两个方法,每个方法都使用其 @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/

相关文章:

java - 写入速度比从套接字读取速度快

java - 如果只有一个选项卡存在,有没有办法隐藏 JTabbedPane 的选项卡栏?

java - 嵌套类中对象的数组

java - PocessBuilder 程序无法远程连接到 JMX

java - 露天 Java 词典服务

java - 使用Java JDBC的UDF函数不起作用

java - 我应该如何配置 Jackson 以使用列表项上的 @XmlRootElement 生成 XML

java - 在 Spring 中使用 REST,而不使用 MVC

java - Spring MVC 多行表单提交提交新的 ModelAttribute

spring - 收件人端点与 SAML 响应不匹配