我有一个 Spring Rest 服务,其中有一个路径参数是可选的(实际情况是我原来将参数放到路径中,而另外一个前端通过 body 传给我)。按照传统的方式是把这个服务在代码里面分成两个方法,一个带路径参数,一个不带,但是这样看起来不优雅,让人疑惑。
我试着给 @PathVariable 注解加上 require=false 注解,但是不起作用,返回404错误。下面的形式就是传统方式:
@RequestMapping(value = "/path/{id}")
public String getResource(@PathVariable String id) {
return service.processResource(id);
}
@RequestMapping(value = "/path")
public String getResource() {
return service.processResource();
}
但是我真的不喜欢这种方式,臃肿。
从 Spring 4 and Java 8 开始(其实和 Java 8 关系不大),在一个方法里面实现可选路径参数变得很简单,如下所示,就是同时定义两个路由:
@RequestMapping(value = {"/path", "/path/{id}")
public String getResource(@PathVariable Optional<String> id) {
if (id.isPresent()) {
return service.processResource(id.get());
} else {
return service.processResource();
}
}
确实,在一个方法里面统一业务要优雅得多。