JSR-303
JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation。说白了就是做参数校验。
为什么要做参数验证?
永远不要相信我们在后端接收到的用户数据,防止用户恶意通过伪造的参数破坏我们的系统。比如绕过前端程序,直接模拟客户端请求,使得我们的系统存在安全隐患。所以,后端必须进行参数校验!
解决的问题
未使用 Hibernate Validator 时,我们可能会通过以下的方式(大量地使用 if/else 语句嵌套实现)对接口参数进行校验。如果需要校验的参数过多就会导致代码的臃肿,校验逻辑晦涩难通,不利于长期维护!
@ApiOperation("添加用户")
@PostMapping
public ResponseEntity<Long> addUser(@RequestBody MingYueUser user) throws Exception {
if (null == user.getUserId()) {
throw new Exception("userId 不能为空!");
}
if (StrUtil.isBlank(user.getUsername())) {
throw new Exception("username 不能为空!");
}
...
...
return ResponseEntity.ok(mingYueUserService.addUser(user));
}
下面就来解决一下上述问题。
Hibernate Validator
Hibernate Validator 是 Bean Validation 的参考实现。 Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
常用注解
message 尽量要写不然前端不知道是哪个字段
注解 / 说明
@Null(message = “XXXX不能为空”) 元素必须为 null
@NotNull(message = “XXXX不能为空”) 元素必须不为 null
@Length 字符串的大小必须在指定的范围内,注意只能用在 String 上 否则会报错
@NotEmpty 字符串的必须非空,注意只能用在 String 上,否则会报错
@AssertTrue(message = “XXXX”) 必须为 true
@AssertFalse 必须为 false
@Min(value=L,message=“XXXX”) 必须是一个数字,其值必须大于等于指定的最小值
@Max(value=L,message=“XXXX”) 必须是一个数字,其值必须小于等于指定的最小值
@DecimalMin(value=L,message=“XXXX”) 必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value=L,message=“XXXX”) 必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 大小必须在指定的范围内
@Digits (integer, fraction) 必须是一个数字,其值必须在可接受的范围内
@Past 必须是一个过去的日期
@Future 必须是一个将来的日期
@Pattern(value) 必须符合指定的正则表达式
@Email 必须是电子邮箱地址
@Range 必须在合适的范围内
@NotBlank 验证字符串非 null,且长度必须大于0,注意只能用在 String 上,否则会报错
SpringBoot 整合 Hibernate Validator
1、引入 Hibernate Validator 依赖
<!-- Hibernate Validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、增加字段注解
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "用户实体类", description = "用户信息描述类")
public class MingYueUser {
@NotNull(message = "用户id不能为空")
@ApiModelProperty(value = "用户id")
private Long userId;
@NotBlank(message = "用户名不能为空")
@ApiModelProperty(value = "用户名")
private String username;
}
3、接口使用 @Valid/@Validated 开启参数校验
@ApiOperation("添加用户")
@PostMapping
public ResponseEntity<String> addUser(
@RequestBody @Validated MingYueUser user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return ResponseEntity.ok(JSONUtil.toJsonStr(bindingResult.getFieldErrors()));
}
return ResponseEntity.ok(mingYueUserService.addUser(user).toString());
}
原文链接:https://blog.csdn.net/csp732171109/article/details/124216984