写在最前
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) | 必须符合指定的正则表达式 |
必须是电子邮箱地址 | |
@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());
}
4.测试接口
Demo 地址:mingyue-springboot-validator
启动项目,访问:http://localhost:8080/swagger-ui/index.html,直接使用 Swagger 测试接口。使用方式可以参考:【接口篇】SpringBoot 整合 Swagger2 实现在线 API 文档
userId 不传递,接口参数报错如下:
[
{
"bindingFailure": false,
"codes": [
"NotNull.mingYueUser.userId",
"NotNull.userId",
"NotNull.java.lang.Long",
"NotNull"
],
"field": "userId",
"objectName": "mingYueUser",
"defaultMessage": "用户id不能为空",
"arguments": [
{
"codes": [
"mingYueUser.userId",
"userId"
],
"defaultMessage": "userId"
}
]
}
]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/78346.html