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

Hibernate @Min注解自定义校验message不生效问题解决方法

问题原因

你看到的Page index must not be less than one报错并非@Min注解校验抛出的提示,而是非法参数绕过校验进入业务分页逻辑后,由分页组件(如Spring Data分页、自定义分页工具)抛出的内置异常,核心原因是路径变量上的参数校验规则根本没有触发。

校验失效的核心原因
  • 缺少类级别@Validated注解:Spring中针对方法非请求体参数(路径变量、请求参数)的JSR校验,必须在Controller类上添加@Validated注解开启方法级校验支持,仅在参数上添加@Valid无法触发校验逻辑。
  • 注解顺序不规范:校验注解和参数绑定注解顺序混乱,会导致部分场景下校验切面无法识别约束规则。
  • 缺少异常适配:默认情况下校验触发后抛出的ConstraintViolationException不会被Spring MVC自动解析为自定义提示,需要手动配置异常捕获逻辑。
解决步骤
  1. 给Controller类添加@Validated注解,开启方法级参数校验
  2. 调整参数注解顺序,移除冗余的@Valid标注(类上加了@Validated后,路径变量上的约束注解可直接生效),修正后的Controller代码如下:
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Min;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@Validated
public class ProfileController {
  @GetMapping("/profiles/{pageSize}/{pageNo}")  
  public ResponseEntity<List<ProfileResponse>> getProfile(
    @PathVariable @Min(value = 1, message = "Page Number must be Positive Number") Integer pageNo,
    @PathVariable @Min(value = 1, message = "Page Size must be Positive Number") Integer pageSize
  ) {
    // 业务逻辑
  }
}
  1. 添加全局异常处理器,捕获校验抛出的异常,提取自定义校验消息返回给前端,示例代码如下:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<String> handleParamValidError(ConstraintViolationException e) {
        String errMsg = e.getConstraintViolations()
                .stream()
                .map(ConstraintViolation::getMessage)
                .collect(Collectors.joining("; "));
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errMsg);
    }
}
注意事项

配置完成后,非法参数会在进入业务逻辑前被校验切面拦截,不会再流入分页组件触发内置的页码错误,接口会直接返回你在@Min注解中定义的自定义提示。


内容的提问来源于stack exchange,提问作者user16897456

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:39:25