You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:57:03