Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 具有路径变量的多个requestmapping值_Java_Spring Mvc - Fatal编程技术网

Java 具有路径变量的多个requestmapping值

Java 具有路径变量的多个requestmapping值,java,spring-mvc,Java,Spring Mvc,对于一个url,我正在传递path变量,而对于另一个url,我没有传递。但是我希望这两个url都使用相同的API。如何实现它?我们不能有可选路径变量,您可以有两个控制器方法,它们可以调用相同的服务 第一种方法 @RequestMapping(value = {"/abcd", "/employees/{value}/{id}"}) public String getEmployees( @PathVariable(value = "value") String val,

对于一个url,我正在传递path变量,而对于另一个url,我没有传递。但是我希望这两个url都使用相同的API。如何实现它?

我们不能有
可选路径变量
,您可以有两个控制器方法,它们可以调用相同的服务

第一种方法

@RequestMapping(value = {"/abcd", "/employees/{value}/{id}"})
public String getEmployees(
      @PathVariable(value = "value") String val, 
      @PathVariable(value = "id") String id,
      @RequestParam(value = "param", required = false) String value) {
        // ********

}
@RequestMapping("/abcd")
public String getEmployees(@RequestParam(value="param", required=false)String value){}
第二种方法

@RequestMapping(value = {"/abcd", "/employees/{value}/{id}"})
public String getEmployees(
      @PathVariable(value = "value") String val, 
      @PathVariable(value = "id") String id,
      @RequestParam(value = "param", required = false) String value) {
        // ********

}
@RequestMapping("/abcd")
public String getEmployees(@RequestParam(value="param", required=false)String value){}
对于
@RequestParam
,我们可以使用

@RequestParam(value=“somevalue”,required=false)


对于可选的
参数
而不是
路径变量

,我们找到了一种不使用多种方法的方法

首先创建一个简单类来保存路径变量:

@RequestMapping("/employees/{value}/{id}")
public String getEmployees(@PathVariable(value="value") String val, @PathVariable(value="id") String id, @RequestParam(value="param", required=false) String value){}
然后定义控制器方法,如下所示:

public class EmployeesRequest {
  private String value;
  private String id;

  public String getValue() {
    return this.value;
  }

  public void setValue(String value) {
    this.value = value;
  }

  public String getId() {
    return this.id;
  }

  public void setId(String id) {
    this.id = id;
  }
}
Spring将自动映射
EmployeesRequest
类可用的任何路径变量。Spring还将对任何请求参数执行此操作,因此您可以通过将请求参数添加到
EmployeesRequest
,进一步简化操作:

@RequestMapping(value={
  "/abcd",
  "/employees/{value}/{id}"
})
public String getEmployees(@RequestParam(value="param", required=false) String param,
                           EmployeesRequest request) {
  if (request.getValue() != null) {
    // do something
  } else {
    // do something else
  }
}
最后:

public class EmployeesRequest {
  private String value;
  private String id;
  private String param;

  public String getValue() {
    return this.value;
  }

  public void setValue(String value) {
    this.value = value;
  }

  public String getId() {
    return this.id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getParam() {
    return this.param;
  }

  public void setParam(String param) {
    this.param = param;
  }
}
此解决方案的另一个好处是,现在您可以同时支持变量或请求参数。这意味着所有这些都是有效的:

  • /abcd
  • /abcd?参数=123
  • /abcd?value=123&id=456¶m=789
  • /employees/123/456
  • /employees/123/456?参数=123

通过对Java 8的支持,您现在可以拥有可选的路径变量。至少需要Spring版本4.x

@RequestMapping(value={
  "/abcd",
  "/employees/{value}/{id}"
})
public String getEmployees(EmployeesRequest request) {
  if (request.getValue() != null) {
    // do something
  } else {
    // do something else
  }
}
@RequestMapping({“/abcd”,“/employees/{value}/{id}”)
公共字符串getEmployees(
@路径变量(“值”)可选值,
@PathVariable(“id”)可选id,
@RequestParam(“param”)可选值
) {
// ********
}

注意:这不适用于可选原语(
optionant
等)。

我遇到了类似的问题,我找到了以下解决方案:

@RequestMapping({"/abcd", "/employees/{value}/{id}"})
public String getEmployees(
    @PathVariable("value") Optional<String> val, 
    @PathVariable("id") Optional<String> id,
    @RequestParam("param") Optional<String> value
) {
    // ********
}
@GetMapping(值={”/clients/page“,“/clients/page/{page}”)
公共页索引(@PathVariable可选页){
PageRequest PageRequest=page.map(整数->PageRequest.of(整数,4))
.orElseGet(()->PageRequest.of(0,4));
return clientService.showAll(pageRequest);
}
Intellij帮助我得到了这种紧凑的结果。尽管Intellij抛出了以下消息:

''报告使用java.util.Optional、java.util.OptionalDouble、java.util.OptionalInt、java.util.OptionalLong或com.google.common.base.Optional作为字段或参数类型的任何情况。Optional旨在为库方法返回类型提供一种有限的机制,其中需要有一种明确的方式来表示“无结果”。如果类需要可序列化,则使用java.util.Optional类型的字段也是有问题的,而java.util.Optional不是

老实说,我是这个行业的新手,我不清楚IDE告诉我什么。如果有更专业的人可以帮助澄清这一信息,那就太好了