后端参数校验
实验目的
1.理解后端参数校验的重要性。
2.掌握 Spring Boot 参数校验机制。
3.掌握常用校验注解(@NotNull、@NotBlank、@Min 等)。
4.掌握 @Valid 的使用方法。
5.结合全局异常处理,实现校验错误统一返回。
实验环境
开发工具:IntelliJ IDEA
构建工具:Maven
测试工具:Postman或浏览器
AI工具:通义灵码
实验要求
在校园二手交易系统中,实现全局异常处理功能:
1.对商品新增接口进行参数校验
2.字段不能为空、长度限制、数值范围校验
3.校验失败时返回统一 Result 格式
4.结合实验08,实现校验异常统一处理
实验内容
第一部分:问题引入
当前系统问题:
❌ 可以提交空数据
❌ 价格可以为负数
❌ 字段长度无限制
❌ 数据不安全
目标:接口自动校验参数合法性
第二部分:引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
第三部分:实体类添加校验注解
public class Goods {
private Long id;
@NotBlank(message = "商品名称不能为空")
private String title;
@NotBlank(message = "商品描述不能为空")
private String description;
@NotNull(message = "价格不能为空")
@Min(value = 1, message = "价格必须大于0")
private Double price;
@NotBlank(message = "发布人不能为空")
private String seller;
}
常用注解说明:
|-----------|----------|
| 注解 | 说明 |
| @NotNull | 不能为 null |
| @NotBlank | 字符串不能为空 |
| @Min | 最小值 |
| @Max | 最大值 |
| @Size | 长度限制 |
第四部分:Controller 开启校验
1.新增商品接口
@PostMapping("/goods")
public Result<String> add(@RequestBody @Valid Goods goods){
goodsMapper.insert(goods);
return Result.success("添加成功");
}
作用:
@Valid 用于开启校验
第五部分:处理校验异常
1.在GlobalExceptionHandler 中新增:
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
StringBuilder errorMessage = new StringBuilder();
e.getBindingResult().getFieldErrors().forEach(error -> {
if (errorMessage.length() > 0) {
errorMessage.append("; ");
}
errorMessage.append(error.getField()).append(": ").append(error.getDefaultMessage());
});
return Result.error(400, errorMessage.toString());
}
第六部分:测试功能
1.正常请求
{
"title": "二手耳机",
"description": "几乎全新",
"price": 100,
"seller": "张三"
}
返回:
{
"code": 200,
"message": "操作成功",
"data": "添加成功"
}
2.字段为空
{
"title": "",
"description": "测试",
"price": 100,
"seller": "张三"
}
返回:
{
"code": 400,
"message": "title: 商品标题不能为空",
"data": null
}
3.价格非法
{
"title": "测试商品",
"description": "测试",
"price": -10,
"seller": "张三"
}
返回:
{
"code": 400,
"message": "price: 商品价格必须大于 0",
"data": null
}
