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

cur*_*us1 39 spring path-variables spring-mvc

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

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

我想使用PathVariable,如下所示:

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

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

感谢帮助!

Mar*_*rko 55

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

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

  • 请注意,从Spring 4.3.3开始,您还可以使用`@PathVariable(required = false)`并在变量不存在时获取null. (3认同)
  • @NicolaiEhemann,感谢您提供的信息,这是正确的.但那只是行不通.它可能像`@RequestMapping(value = {"foo","foo/{bar}"})`和`@PathVariable(required = false)` (3认同)
  • 请注意,这需要Spring 4.1+和Java 1.8. (2认同)

Tri*_*tan 39

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


VTT*_*Tom 30

我知道这是一个老问题,但是搜索"可选路径变量"会使这个答案很高,所以我认为值得指出的是,自从使用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
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 任何人都可以验证这项工作吗?当我尝试访问不带id的路径时,我得到404(Spring MVC 4.1.4,Java 1.8.0_66)。 (2认同)