Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringWebMVC:对请求参数和路径变量使用相同的请求映射_Java_Spring_Spring Mvc_Annotations - Fatal编程技术网

Java SpringWebMVC:对请求参数和路径变量使用相同的请求映射

Java SpringWebMVC:对请求参数和路径变量使用相同的请求映射,java,spring,spring-mvc,annotations,Java,Spring,Spring Mvc,Annotations,有没有一种方法可以表示我的SpringWebMVC控制器方法应该由一个请求匹配,该请求将一个ID作为URI路径的一部分 @RequestMapping(method=RequestMethod.GET, value="campaigns/{id}") public String getCampaignDetails(Model model, @PathVariable("id") Long id) { 。。。或者,如果客户端在样式中以HTTP请求参数的形式发送ID @RequestMappin

有没有一种方法可以表示我的SpringWebMVC控制器方法应该由一个请求匹配,该请求将一个ID作为URI路径的一部分

@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {
。。。或者,如果客户端在样式中以HTTP请求参数的形式发送ID

@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {
在我看来,这是一个非常常见的现实世界的URL方案,我不想添加重复的代码,但我还没有找到答案。欢迎任何建议


EDIT:事实证明,目前似乎存在(使用Spring MVC您可以为同一函数设置映射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时也会映射,但您可以在方法内部控制它


编辑:以前的解决方案不起作用,因为当没有
{null}
且无法映射URL时,
@PathVariable
未设置为
null
(感谢ngeek)。我认为唯一可行的解决方案是创建两个方法,每个方法都映射有它的
@MappingRequest
,在其中一个方法中调用另一个函数或重定向到另一个URL(重定向:或转发:Spring前缀)。我知道这个解决方案不是你想要的,但我认为这是你能做的最好的解决方案。事实上,你不是在复制代码,而是在创建另一个函数来处理另一个URL。

如果你仍然想坚持使用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"));

   }
@RequestMapping(method=RequestMethod.GET,value={“活动/{id}”,“活动”})
公共字符串getCampaignDetails(模型,
@路径变量映射路径变量)
{
System.out.println(pathVariables.get(“id”);
}

注释
@RequestMapping
现在支持设置
路径
属性,而不是
名称
。使用
路径
,可以实现此问题所需的映射:

@RequestMapping(method=RequestMethod.GET,path=“活动/{id}”)
公共字符串getCampaignDetails(模型模型,@PathVariable(“id”)长id){
@RequestMapping(method=RequestMethod.GET,value=“活动”)
公共字符串getCampaignDetails(模型模型,@RequestParam(“id”)长id){

不幸的是,这不起作用,因为无法解析path变量。我还尝试了一个变量,添加到方法参数(@PathVariable(“id”)Long id2)但是您不能将路径变量设置为可选,因此建议的解决方案不起作用。还有其他建议吗?@ngeek我没有意识到@PathVariable不能设置为null,谢谢。我还忘了写@PathVariable,所以我编辑了我的答案以添加它,我想您不能避免使用两种方法,我认为:(.感谢回到您的建议中来,Javi.当然,我已经委托给了相同的内部方法,以避免重复代码。我仍然认为Spring MVC注释应该提供一种方法,通过内部方法将多个URL定义映射到相同的方法,就像Rails或Grails中的路由器已经允许的那样。谢谢您的帮助是的。这个例子让我对添加id2感到有点困惑。其他对此感到困惑的人可能希望知道这是有效的:@PathVariable@RequestParam(value=“id”,required=false)当我这样做时,@OutcastSource
@PathVariable
似乎被忽略了。对我起作用的是@Javi在
@PathVariable
中用
required=false
给出的答案,该答案自Spring MVC 4.3.3以来一直受支持。