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

导读:本篇文章讲解 【接口篇】SpringBoot 实现 JSR-303 参数校验,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

写在最前

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"
            }
        ]
    }
]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/78346.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!