Spring Boot Kotlin项目@RequestParam参数校验不生效返回200而非422问题
核心问题原因
@NotBlank加在@RequestParam参数上校验失败时,抛出的是ConstraintViolationException,你当前的全局异常处理器仅处理了@RequestBody实体校验抛出的MethodArgumentNotValidException,异常未被正确捕获导致返回状态码不符合预期。
解决方案
第一步:新增ConstraintViolationException异常处理逻辑
在GlobalExceptionHandler类中添加以下处理方法:
@ExceptionHandler(ConstraintViolationException::class) fun handleConstraintViolationException(ex: ConstraintViolationException): ResponseEntity<Any> { val errors = hashMapOf<String, String>() ex.constraintViolations.forEach { violation -> // 提取参数名,过滤掉方法名前缀 val paramName = violation.propertyPath.last().name errors[paramName] = violation.message ?: "参数校验不通过" } return ResponseEntity( ApiResponse.ValidationError( errors, ErrorCodes.VALIDATION_FAILED ), HttpStatus.UNPROCESSABLE_ENTITY ) }
第二步:可选补充(处理必填参数未传场景)
如果需要处理@RequestParam未传递的场景,还可新增MissingServletRequestParameterException的处理:
@ExceptionHandler(MissingServletRequestParameterException::class) fun handleMissingParamException(ex: MissingServletRequestParameterException): ResponseEntity<Any> { val errors = hashMapOf<String, String>() errors[ex.parameterName] = "参数${ex.parameterName}为必填项" return ResponseEntity( ApiResponse.ValidationError( errors, ErrorCodes.VALIDATION_FAILED ), HttpStatus.UNPROCESSABLE_ENTITY ) }
常见坑排查
如果修改后依然不生效,检查@NotBlank的导入包:
- Spring Boot 3.x 版本必须导入
jakarta.validation.constraints.NotBlank - Spring Boot 2.x 版本必须导入
javax.validation.constraints.NotBlank
内容的提问来源于stack exchange,提问作者Annon
相关产品推荐
相关产品推荐

