下面我将详细讲解“SpringBoot利用validation实现优雅的校验参数”的攻略,包括对应的示例。
什么是validation?
validation 是 validation JSR-303 规范中的校验框架。它提供了很多预置的注解,可以适用于大多数的校验场景,同时支持自定义注解进行校验。
SpringBoot如何使用Validation
SpringBoot 支持对方法参数和请求参数进行校验。一般情况下,我们可以通过编写校验类(通常放在 request 文件夹下),然后在 Controller 层中调用,并标记需要校验的参数。
环境配置
首先需要在 pom.xml
中导入 validation 和相关的 Hibernate-Validator 依赖。示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
编写校验注解
我们通常会在 request 文件夹下,编写校验类,来进行具体的参数校验。而这些参数校验可以使用 validation 中自带的注解进行标记。这里给出一个 NewUserRequest
的示例校验类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class NewUserRequest {
@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 10, message = "用户名长度为2-10")
private String username;
@Email(message = "邮箱地址格式不正确")
private String email;
@NotNull(message = "年龄不能为空")
@Min(value = 18, message = "年龄必须大于18岁")
@Max(value = 150, message = "年龄必须小于150岁")
private Integer age;
}
上述代码中,我们可以看到使用了很多 validation 中自带的注解来进行了各种校验;比如说:
@Size(min = 2, max = 10, message = "用户名长度为2-10")
:对用户名进行长度校验,并定义了错误信息;@Email(message = "邮箱地址格式不正确")
:对邮箱格式进行校验,并定义了错误信息;@NotNull(message = "年龄不能为空")
、@Min(value = 18, message = "年龄必须大于18岁")
和@Max(value = 150, message = "年龄必须小于150岁")
分别对年龄进行非空校验和范围校验,并定义了错误信息。
在Controller层使用校验
在 Controller 层中,我们可以根据具体业务逻辑,标记需要校验的参数。当参数不符合要求时,将抛出 MethodArgumentNotValidException
异常,我们可以通过统一的异常处理器进行处理。这里给出示例代码:
@RestController
public class UserController {
@PostMapping("/users")
public void addUser(@RequestBody @Valid NewUserRequest request) {
// 省略具体业务逻辑
}
// 异常处理器
@ExceptionHandler(MethodArgumentNotValidException.class)
public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
List<ObjectError> objectErrors = e.getBindingResult().getAllErrors();
return R.fail(objectErrors.get(0).getDefaultMessage());
}
}
上述代码中,我们在 Controller 层的 addUser()
方法标注了 @Valid
注解,代表需要校验此参数,在参数校验失败时,将会触发 MethodArgumentNotValidException
异常,我们则通过 handleMethodArgumentNotValidException()
异常处理方法,统一处理异常并返回错误信息。
至此,我们就完成了一个优雅的参数校验示例。
示例
上面仅仅是提供了一个参数校验的示例,下面再简单补充一下自己在做项目时使用参数校验的例子。
假设我们需要编写一个商品服务接口,需要进行以下参数校验:
- 商品的名称不为空,且长度在 2 到 20 个字符之间;
- 商品的售价不能为负数;
- 商品的数量不能为负数。
根据上述要求,我们编写一个 Goods
参数类,并在其中使用 validation 注解进行校验,示例代码如下:
@Data
public class Goods {
@NotBlank(message = "商品名称不能为空")
@Size(min = 2, max = 20, message = "商品名称长度在2-20个字符内")
private String name;
@DecimalMin(value = "0", message = "商品售价不能为负数")
private BigDecimal price;
@Min(value = 0, message = "商品数量不能为负数")
private Integer count;
}
我们在 Controller 层中需要进行校验的方法,可以直接在参数列表中标注 @Valid
注解,并在方法中捕获校验异常,并进行统一处理。具体示例代码如下:
@RestController
@RequestMapping("/goods")
public class GoodsController {
@PostMapping("")
public R addGoods(@RequestBody @Valid Goods goods, BindingResult result) {
if (result.hasErrors()) {
return R.fail(result.getFieldError().getDefaultMessage());
}
// 业务逻辑处理
return R.ok();
}
// 统一异常处理
@ExceptionHandler(MethodArgumentNotValidException.class)
public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
return R.fail(e.getBindingResult().getFieldError().getDefaultMessage());
}
}
在上述代码中,我们在 addGoods()
方法中标注了 @Valid
注解,代表需要校验方法的参数。当参数校验失败时,将会触发 MethodArgumentNotValidException
异常,我们统一捕获并处理异常,然后返回错误信息给用户。
这一示例中,我们使用了统一的异常处理器方法 handleMethodArgumentNotValidException()
进行异常处理,以实现统一的错误信息返回。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot利用validation实现优雅的校验参数 - Python技术站