注意下面的代码不会触发参数校验
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import lombok.AllArgsConstructor
import javax.validation.constraints.NotBlank;
import java.util.List;
@RestController
@RequestMapping("/user")
@AllArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/list")
public ResponseEntity<List<User>> listUser(
@Valid @NotBlank(message = "参数不能为空") @RequestParam String userName) {
List<User> users = userService.listUsersByKeyName(keyName);
return ResponseEntity.ok(users);
}
}
在Spring MVC中, Spring MVC的默认行为是处理HTTP请求并调用相应的Controller方法,但它不会自动为@RequestParam、@PathVariable等参数执行JSR-303/JSR-349校验,并将校验错误转换为HTTP响应。这是因为这些参数是通过HTTP请求的行(URL路径或查询字符串)传递的,而不是作为请求体的一部分,而Spring MVC的校验机制通常与请求体中的复杂对象相关联。
为了让Controller方法的基本类型参数也可以使用注解进行参数校验可以考虑如下方式:
- 最简单的方式直接在Controller类使用@Validated,这样Controller所有的方法参数一旦增加参数校验注解都会触发校验。
- 使用对象作为方法参数。