当使用Spring MVC框架时,我们常常需要使用到在Controller中对参数进行传递。参数传递主要有两种方式:@PathVariable和@RequestParam。
其中,@PathVariable用于映射URL中的变量部分,例如:
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
在这个例子中,@PathVariable将这个URL中的{id}匹配到了Java方法的参数中。例如,如果URL为”/users/1″,则getUser()方法的参数id就是1。这样我们就可以获取到指定id的用户信息。
但是当使用@PathVariable或@RequestParam时,如果参数的值为空,则会出现一些问题。
问题1:以@PathVariable方式传参如果参数为空始终报404错误
例如在以下的情况下,我们需要获取指定id的用户信息:
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
当进行URL请求时,如果请求地址中{id}的值为空,会报404错误,如下所示:
GET /users/ HTTP/1.1
这是因为@PathVariable中的占位符是必须要有值的,不能为null或空字符串。
解决方法1:给@PathVariable设置默认值
我们可以为@PathVariable设置默认值。例如在上面的例子中,可以使用下面的方式进行修改:
@GetMapping("/users/{id}")
public User getUser(@PathVariable(required = false, value = "id") Long id) {
if (id == null) {
// 如果id为空,返回空内容响应码
throw new ResponseStatusException(HttpStatus.NO_CONTENT, "Id is empty");
}
return userService.getUserById(id);
}
其中required属性用于指定id是否为必需的参数,value用于声明我们在方法中使用的参数名。如果id为空,则可以选择返回一个空响应或者抛出一个异常。这里我们使用了ResponseStatusException来抛出自定义的响应码和信息。
问题2:以@RequestParam方式传参如果参数为空则会出现异常
@RequestParam用于获取请求参数中的值,例如:
@GetMapping("/users/")
public List<User> getUsers(@RequestParam(value = "gender", required = false) String gender) {
return userService.findUsersByGender(gender);
}
如果请求中存在gender参数,那么gender的值将会被传递给方法体内的gender变量。但是当传递的参数值为null或空字符串时,会有异常出现。
例如当进行URL请求时,如果参数gender为空:
GET /users?gender= HTTP/1.1
会抛出以下异常:
org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'gender' is not present
这是因为@RequestParam中的参数是必需的,不能为null或空字符串。
解决方法2:为@RequestParam设置默认值
我们可以为@RequestParam设置默认值。例如在上面的例子中,可以使用下面的方式进行修改:
@GetMapping("/users/")
public List<User> getUsers(@RequestParam(value = "gender", defaultValue = "") String gender) {
if (StringUtils.isBlank(gender)) {
// 如果gender为空,返回所有用户信息
return userService.getAllUsers();
}
return userService.findUsersByGender(gender);
}
在这个方法中,我们将defaultValue属性设置为空字符串,当gender参数为空时,会默认为我们提供一个空字符串作为默认值。同时,我们也可以通过Apache Common Lang库提供的StringUtils.isBlank()方法来判断gender是否为空字符串,从而正确地进行业务逻辑处理。
结语:
以上就是“@PathVariable和@RequestParam传参为空问题及解决”的完整攻略,通过设置默认值的方式我们可以成功解决这个问题,同时也加强了代码的健壮性和可读性。如果这些技巧没有解决你的问题,请查看Spring的文档和源代码来更好地理解这些参数处理方式。