Spring REST Controller中可选查询参数的正确验证方法
解决方案
要实现“可选参数存在时非空非空白”的校验,无需显式代码检查,仅通过Spring注解工具可按以下步骤操作:
开启控制器参数校验
在你的控制器类上添加@Validated注解,这是Spring方法参数校验的核心开关,缺少它的话,参数上的校验注解不会生效。配置category参数的校验规则
对category参数使用@RequestParam(required = false)声明其为可选,同时配合@Pattern(regexp = "^\\S+$")注解——该正则表达式要求字符串必须包含至少一个非空白字符。这样:
- 当请求中没有category参数时,category值为null,
@Pattern不会触发校验,请求正常通过; - 当请求中存在category参数但值为空(如
category=)或全空白(如category=)时,校验失败,Spring会抛出ConstraintViolationException。
修改后的接口代码示例:
@Validated @RestController public class LibraryController { @GetMapping("/books") public List<Book> getBooks( @RequestParam @NotNull Long id, @RequestParam(required = false) @Pattern(regexp = "^\\S+$") String category) { return libraryService.getBooks(id, category); } }
- 全局异常处理返回400响应
默认情况下Spring会将校验失败的ConstraintViolationException转换为500内部错误,需添加全局异常处理器捕获该异常,返回400 Bad Request响应:
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity<String> handleConstraintViolation(ConstraintViolationException ex) { String errorMessage = ex.getConstraintViolations().stream() .map(violation -> violation.getMessage()) .findFirst() .orElse("Invalid request parameters"); return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST); } }
配置完成后:
- 无category参数的请求(如
/books?id=1234)会正常进入方法; - 带空值category的请求(如
/books?id=1234&category=)会被校验拦截,返回400错误; - 带有效category值的请求(如
/books?id=1234&category=fiction)正常处理。
内容的提问来源于stack exchange,提问作者NoobCoder
相关产品推荐
相关产品推荐

