前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot简明教程--参数校验

Spring Boot简明教程--参数校验

作者头像
听城
发布2021-01-29 10:53:55
5740
发布2021-01-29 10:53:55
举报
文章被收录于专栏:杂七杂八

添加依赖

如想正常食用参数校验功能,请先添加hibernate Validator依赖,SpringBoot已经集成了该依赖,就不必单独导入了,是不是更香了呢!

代码语言:javascript
复制
<dependency>
       <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

常用属性注解

代码语言:javascript
复制
@Null   被注释的元素必须为 null
@NotNull    被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse    被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past   被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
@Email  被注释的元素必须是电子邮箱地址
@Length(min=, max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty   被注释的字符串的必须非空
@Range(min=, max=)  被注释的元素必须在合适的范围内

常用参数注解

代码语言:javascript
复制
@PathVaribale 获取url中的数据
@RequestParam 获取请求参数的值
@RequestBody 利用一个对象去获取前端传过来的数据

@PathVaribale

在类上添加@Validated注解

代码语言:javascript
复制
//请求URL:localhost:8080/hello/id 获取id值
//在浏览器中 输入地址:localhost:8080/hello/100,输出:id:100
id:81name:hello
@RestController
@Validated
public class HelloController {
    @GetMapping(value="/hello/{id}")
    public String sayHello(@PathVariable("id") Integer id){
        return "id:"+id;
    }
}

@RequestParam

在类上添加@Validated注解

代码语言:javascript
复制
//获取url参数值,如localhost:8080/hello?id=100,输出:id:100
@RestController
@Validated
public class HelloController {
    @RequestMapping(value="/hello",method= RequestMethod.GET)
    public String sayHello(@RequestParam Integer id){
        return "id:"+id;
    }
}

@RequestBody

在类上可以不用添加注解,但是在参数列表里需要添加@Validated注解或者@Valid注解

代码语言:javascript
复制
// 使用postman
public class User {
    private Integer id;
    @Length(min = 2)
    private String name;
}
@RestController
@Validated
public class HelloController {
    @GetMapping("/test")
    public User gettest(@RequestBody @Validated User user){
        return user;
    }
}

拓展

级联验证

顾名思义在一个实体类中包含其他的实体类,其他的实体类也需要做参数校验。解决方案:在其他类上添加@Valid注解

代码语言:javascript
复制
// school类
@Data
public class School {
    @Length(min = 2)
    private String name;
}
// User类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;
    @Length(min = 2)
    private String name;
    @Valid
    private School school;
}
// controller
@RequiredArgsConstructor
@RestController
@Validated
public class HelloController {
    @GetMapping("/test")
    public User gettest(@RequestBody @Validated User user){
        return user;
    }
}

@Valid和@Validated关系

  • @Valid和@Validated具有一定的相似性,在一些情况下@Valid可以替代@Validated
  • 推荐使用方法:在开启验证的时候优先使用@Validated,将@Valid用在级联验证的时候

自定义注解校验

  • 定义注解
代码语言:javascript
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
    String message() default "passwords are not equal";
    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
  • 定义验证类
代码语言:javascript
复制
/**
 * 1.要实现ConstraintValidator接口
 * 2.该接口是一个泛型有两个参数,第一个参数是对应的注解类型,第二个参数是PasswordEqual自定义注解修饰的目标的类型
 */
public class PasswordValidator implements ConstraintValidator<PasswordEqual, User> {
    @Override
    public boolean isValid(User user, ConstraintValidatorContext constraintValidatorContext) {
        return user.getPassword1().equals(user.getPassword2());
    }
}
  • 在需要验证的类上打上注解
代码语言:javascript
复制
@Data
@AllArgsConstructor
@NoArgsConstructor
@PasswordEqual
public class User {

    private Integer id;
    @Length(min = 2)
    private String name;
    @Valid
    private School school;
    private String password1;
    private String password2;
}

参考文献

https://www.liaoxuefeng.com/wiki/1252599548343744/1265102803921888

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 添加依赖
  • 常用属性注解
  • 常用参数注解
    • @PathVaribale
      • @RequestParam
        • @RequestBody
        • 拓展
          • 级联验证
            • @Valid和@Validated关系
              • 自定义注解校验
              • 参考文献
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档