簡體   English   中英

帶路徑變量的多個請求映射值

[英]Multiple requestmapping value with path variables

@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) {
        // ********

}

對於一個網址,我傳遞的是路徑變量而一個我不是。 但我希望這兩個網址都能使用相同的API。 我怎樣才能實現它?

您現在可以通過支持Java 8 Optional來獲得可選的路徑變量。 至少需要Spring 4.x版。

@RequestMapping({"/abcd", "/employees/{value}/{id}"})
public String getEmployees(
    @PathVariable("value") Optional<String> val, 
    @PathVariable("id") Optional<String> id,
    @RequestParam("param") Optional<String> value
) {
    // ********
}

注意,這不適用於可選的原語( OptionalInt等)。

我們不能有optional path variables ,你可以有兩個控制器方法可以調用同一個服務。

第一種方法

@RequestMapping("/abcd")
public String getEmployees(@RequestParam(value="param", required=false)String value){}

第二種方法

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

對於@RequestParam我們可以使用,

@RequestParam(value="somevalue",required=false)

對於可選params而不是pathVariable

剛剛找到了一種方法,可以不使用多種方法。

首先創建一個簡單的類來保存路徑變量:

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;
  }
}

然后像這樣定義你的控制器方法:

@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
  }
}

Spring將自動映射EmployeesRequest類可用的任何路徑變量。 Spring也會為任何請求參數執行此操作,因此您可以通過將請求參數添加到EmployeesRequest來進一步簡化操作:

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;
  }
}

最后:

@RequestMapping(value={
  "/abcd",
  "/employees/{value}/{id}"
})
public String getEmployees(EmployeesRequest request) {
  if (request.getValue() != null) {
    // do something
  } else {
    // do something else
  }
}

此解決方案的另一個好處是,現在您可以同時支持變量或請求參數。 意味着所有這些都是有效的:

  • /abcd
  • /abcd?param=123
  • /abcd?value=123&id=456&param=789
  • /employees/123/456
  • /employees/123/456?param=123

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM