Spring脚手架集成校验框架
# 前言
在上一篇文章Spring脚手架集成分页插件 (opens new window)我们集成的分页插件,实现一行代码完成分页查询,接下来我们继续对脚手架进行进一步优化。
我们日常开发的时候,经常在controller中要编写非常冗长的参数校验,使得原本仅仅一个简单的功能的代码又臭又长,对此我们不妨引入一个校验框架,实现一个注解完成参数校验。
# 集成步骤
# 引入依赖
第一步无需多言,首先我们引入校验框架的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1
2
3
4
2
3
4
# 对需要校验的成员变量添加校验注解
例如我们的现在有下面几个需求:
- 分页查询页码不能为空。
- 分页查询要求行数不可为空。
- 分页查询要求行数不可超过1000。
假如我们用代码实现,可能就会平白无故的增加3个if逻辑了,但是集成了校验框架之后,我们只需对请求参数类增加这样几个注解即可。

完整代码如下所示
public class PageReq {
@NotNull(message = "【页码】不能为空")
private int page;
@NotNull(message = "【每页条数】不能为空")
@Max(value = 1000, message = "【每页条数】不能超过1000")
private int size;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("PageReq{");
sb.append("page=").append(page);
sb.append(", size=").append(size);
sb.append('}');
return sb.toString();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 测试
完成上述步骤后,我们对需要用到校验的参数添加一个@Valid注解,代码如下所示

我们不妨将请求的行数设置为10000看看会不会报错,可以看到输出结果中确实报错了,自此分页插件算是集成完成了。

# 统一响应引入错误处理器
引入校验框架校验出错后会抛出BindException,所以我定义一个统一的异常处理器,确保校验框架抛出的异常能够被捕获且转换为统一的响应结果。
首先我们在controller层添加一个ControllerExceptionHandler

然后我们键入下面这段内容,可以看到当我们捕获到BindException,会统一返回一个CommonResp 出去。
/**
* 统一异常处理、数据预处理等
*/
@ControllerAdvice
public class ControllerExceptionHandler {
private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);
/**
* 校验异常统一处理
* @param e
* @return
*/
@ExceptionHandler(value = BindException.class)
@ResponseBody
public CommonResp validExceptionHandler(BindException e) {
CommonResp commonResp = new CommonResp();
LOG.warn("参数校验失败:{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
commonResp.setSuccess(false);
commonResp.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return commonResp;
}
/**
* 校验异常统一处理
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public CommonResp validExceptionHandler(Exception e) {
CommonResp commonResp = new CommonResp();
LOG.error("系统异常:", e);
commonResp.setSuccess(false);
commonResp.setMessage("系统出现异常,请联系管理员");
return commonResp;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
我们再次测试一下,可以看到这次捕获错误会响应一个异常给前端了,自此我们的集成工作算是全部完成了。

# 小结
关于校验框架更多注解,可以参考这篇文章SpringBoot 使用Spring Validation实现接口参数校验 (opens new window),写的还是很详细的。
编辑 (opens new window)
上次更新: 2026/03/26, 01:05:31