requestmapping正则 Spring MVC:如何指示是否需要路径变量?




spring mvc路径参数 (4)

VTTom`s解决方案是正确的,只需将“value”变量更改为数组并列出所有URL可能性:value = {“/”,“/ {id}”}

@RequestMapping(method=GET, value={"/", "/{id}"})
public void get(@PathVariable Optional<Integer> id) {
  if (id.isPresent()) {
    id.get()   //returns the id
  }
}

我正在做一个Spring网站。 对于控制器方法,我能够使用RequestParam来指示是否需要参数。 例如:

@RequestMapping({"customer"}) 
public String surveys(HttpServletRequest request, 
@RequestParam(value="id", required = false) Long id,            
Map<String, Object> map)

我想使用PathVariable,如下所示:

@RequestMapping({"customer/{id}"}) 
public String surveys(HttpServletRequest request, 
@PathVariable("id") Long id,            
Map<String, Object> map) 

如何指示是否需要路径变量? 我需要使它成为可选项,因为在创建新对象时,在保存之前没有可用的关联ID。

感谢帮助!


Answer #1

我知道这是一个老问题,但是搜索“可选路径变量”会使这个答案很高,所以我认为值得指出的是,自从使用Java 1.8的Spring 4.1以来,使用java.util.Optional类就可以了。

一个例子是(注意,值必须列出所有需要匹配的潜在路由,即使用id路径变量而不使用。道具指向@ martin-cmarko指出)

@RequestMapping(method=GET, value={"/", "/{id}"})
public void get(@PathVariable Optional<Integer> id) {
  if (id.isPresent()) {
    id.get()   //returns the id
  }
}

Answer #2

VTToms应答将不起作用,因为没有路径中的id它将不匹配(即将找不到相应的HandlerMapping ),因此控制器不会被命中。 相反,你可以做 -

@RequestMapping({"customer/{id}","customer"}) 
public String surveys(HttpServletRequest request, @PathVariable Map<String, String> pathVariablesMap, Map<String, Object> map) {
    if (pathVariablesMap.containsKey("id")) {
        //corresponds to path "customer/{id}"
    }
    else {
        //corresponds to path "customer"
    }
}

您也可以使用其他人提到的java.util.Optional ,但它需要Spring 4.1+和Java 1.8。


Answer #3

没有办法让它成为可选项,但您可以创建两个方法,其中一个方法具有@RequestMapping({"customer"})注释,另一个方法具有@RequestMapping({"customer/{id}"}) ,然后相应地执行每。





path-variables