问题描述
@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。 我怎样才能实现它?
1楼
您现在可以通过支持Java 8 来获得可选的路径变量。 至少需要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
等)。
2楼
我们不能有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
3楼
刚刚找到了一种方法,可以不使用多种方法。
首先创建一个简单的类来保存路径变量:
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¶m=789
-
/employees/123/456
-
/employees/123/456?param=123