【接口篇】SpringBoot 实现 JSR-303 参数校验

写在最前

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());
}

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"
            }
        ]
    }
]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Strive_MY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值