关于@Valid注解大全以及用法规范
目录
- @Valid注解大全及用法规范
- @Valid注解规范用户请求的参数
- 业务场景
- 业务出现的问题
- 优化的解决方案
@Valid注解大全及用法规范
注解 | 描述 |
@AssertFalse | 带注解的元素必须为false,支持boolean/Boolean |
@AssertTrue | 带注解的元素必须为true,支持boolean/Boolean |
@DecimalMax | 带注解的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin | 带注解的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Digits | 带注解的元素必须是一个可接受范围内的数字 |
@Future | 带注解的元素必须是将来的某个时刻、日期或时间 |
@Max | 带注解的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Min | 带注解的元素必须是一个数字,其值必须大于等于指定的最小值 |
@NotNull | 带注解的元素不能是Null |
@Null | 带注解的元素必须是Null |
@Past | 带注解的元素必须是过去的某个时刻、日期或时间 |
@Pattern | 带注解的元素必须符合指定的正则表达式 |
@Size | 带注解的元素必须大于等于指定的最小值,小于等于指定的最大值 |
带注解的元素必须是格式良好的电子邮箱地址 | |
@NotEmpty | 带注解的元素不能是空,String类型不能为null,Array、Map不能为空,切size/length大于0 |
@NotBlank | 字符串不能为空、空字符串、全空格 |
@URL | 字符串必须是一个URL |
@Valid注解规范用户请求的参数
业务场景
【关于@Valid注解大全以及用法规范】对于一个用户的注册操作(Post请求),往往涉及到账号(username)、密码(password)的Post提交:
//用户发送POST请求创建新的用户@PostMappingpublic User create(@RequestBody User user){/**一些数据持久化操作,如:写入数据库**///打印用户提交的信息System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); System.out.println(user.getBirthday()); return user; }
业务出现的问题
但用户往往会不小心提交了空的密码来注册,这是不允许的,因此我们往往需要对用户提交的密码信息进行空判断,常见的方法是直接进行if语句的空判断:
//用户发送POST请求创建新的用户@PostMappingpublic User create(@RequestBody User user){if( StringUtils.isBlank(user.getPassword())){//用户输入密码为空,进行异常处理}/**一些数据持久化操作,如:写入数据库**///打印用户提交的信息System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); System.out.println(user.getBirthday()); return user; }
以上方法看似行得通,但一旦Post的方法变多,则需要对每个Post请求都进行一次if判断是否为空,代码变得冗余,而且一旦修改一个地方,所有if语句都需要修改,可维护性就变得很差。
优化的解决方案
那么,有没有一种方法可以一劳永逸、既没有大量代码冗余,可维护性又好呢?这时 javax.validation包下的@Valid注解就派上用场了。
1.首先,我们在实体类User.java中的密码(password)属性加上@NotBlank注解(hibernate.validator.constraints包)
import org.hibernate.validator.constraints.NotBlank; public class User {public interface UserSimpleView{}public interface UserDetailView extends UserSimpleView{}private String username; //给该属性加入NotBlank非空的约束@NotBlankprivate String password; private String id; private Date birthday; public Date getBirthday() {return birthday; }public void setBirthday(Date birthday) {this.birthday = birthday; }@JsonView(UserSimpleView.class)public String getId() {return id; }public void setId(String id) {this.id = id; }@JsonView(UserSimpleView.class)public String getUsername() {return username; }public void setUsername(String username) {this.username = username; }@JsonView(UserDetailView.class)public String getPassword() {return password; }public void setPassword(String password) {this.password = password; }}
2.我们在Controller类的Post方法的参数中加入@Valid注解,并使用BindingResult将错误信息作为日志打印到后台
@PostMappingpublic User create(@Valid @RequestBody User user,BindingResult errors){if (errors.hasErrors()){//异常处理errors.getAllErrors().stream().forEach(error -> System.out.println(error.getDefaultMessage())); }user.setId("1"); System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); System.out.println(user.getBirthday()); return user; }
3.这时,当我们向服务器Post提交空的密码信息时,后台会打印出错误信息:
may not be empty以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 图像处理|图像处理-形态学操作
- 安全|第一篇关于我的个人博客--与诸君共勉
- python|关于举办“2022年(第15届)中国大学生计算机设计大赛”通知
- 关于localStorage的存储|关于localStorage的存储,读取,删除
- #|【opencv】关于透视变换
- 扇区
- MyBatis|MyBatis 及 MyBatis Plus 纯注解方式配置(Spring Boot + Postgresql)
- 关于python3|关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
- Springboot/java|SpringBoot 中@Controller/@RestController/@RequestMap注解的使用
- 白话大数据 | 关于图数据库,没有比这篇更通俗易懂的啦