关于lombok和@Validated的使用
lombok介绍
Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。
官网地址:https://projectlombok.org/features/all
lombok的实际使用
lombok可以用几个注解,替换掉很多例如getter和setter方法,让代码看起来整洁,在编译时会插入.class文件,以下是经常使用到的注解:
- @Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Permission {
-
@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法
-
@Slf4j //lombok的日志,可直接log.info调用日志
@Slf4j //lombok的日志
@Service
public class UserServiceImpl implements UserService {
log.info("操作完成");
- @Builder 可以给实体类更简洁的赋值方式
//lombok的赋值用法
//builder是一种建造者模式
Permission build = Permission.builder()
.name("aaa")
.url("bbb").build();
permissionMapper.insertSelective(build);
@AllArgsConstructor:作用于类上,用于生成构造函数。
@NoArgsConstructor:无参的构造方法;
@AllArgsConstructor:全参的构造方法;
@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器。
引入lombok和Validated的依赖
springboot中的依赖:
<!--validated的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok辅助类 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
如果在普通的java开发中,对于Validated,可能你需要依赖:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.9.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.6</version>
</dependency>
idea配置lombok的插件
导入lombok的包之后,需要在编辑器加载lombok插件,不然在写程序的过程中无法调用get、set方法。打开idea,File–>Settings–>Plugins–>Browse repositories,搜索lombok,然后install,安装完之后需要重启,此处自行百度。
@Validated
在程序中,前端会在页面上用各种规则限制传送到后台的字段,但是当绕过页面调用后台接口时,后台数据也需要校验,但是当传参时每个参数去判断是很繁琐的,此时可以使用@Validated注解来帮你完成校验:
JSR提供的校验注解:
@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(regex=,flag=) 被注释的元素必须符合指定的正则表达式
正则表达式的说明:
- ^string : 匹配以 string 开头的字符串
- string$ :匹配以 string 结尾的字符串
- ^string$ :精确匹配 string 字符串
- ((^Man$|^Woman$|^UGM$)) : 值只能在 Man,Woman,UGM 这三个值中选择
Hibernate Validator提供的校验注解:
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
以下是我测试的实体类:
@Data //提供getter,setter等一系列方法,如果编辑器的idea,需要安装lombok插件支持,不然无法获取getter,setter
@AllArgsConstructor //提供所有参数的构造方法
@NoArgsConstructor//提供没有参数的构造方法
public class User {
private int id;
@NotBlank(message = "用户名不能为空") //NotBlank:非null,且长度必须大于0
private String username;
@Size(min = 8) //Size:被注释的元素的大小必须在指定的范围内
@NotBlank(message = "密码不能为空") //只作用于string
private String password;
@Email //符合邮箱的规则
@NotBlank(message = "邮箱不能为空")
private String email;
@Pattern(regexp ="((^man$|^women$))" ,message = "必须是男女其中一个值")
@NotBlank(message = "性别不能为空")
private String sex;
@Past //过去的日期
private Date lastLoginDate;
@NotNull //int不能使用notEmpty
private int errorLoginTime;
}
控制器代码
@Controller
@Validated //将Validated放在controller上,这个参数可以告诉 Spring 去校验方法参数。
public class TestController {
@Autowired
Validator validator;
/**
* 实体类验证
* */
@RequestMapping(value = "/addUser",method = RequestMethod.POST)
@ResponseBody
public ResponseEntity addUser(@RequestBody @Valid User user){
return ResponseEntity.ok(user);
}
/**
* 单独参数直接验证
* */
@RequestMapping(value = "/getEmail",method = RequestMethod.POST)
@ResponseBody
public ResponseEntity getEmail(@Email @RequestParam(value = "email") String a,@NotNull String username){
return ResponseEntity.ok(a);
}
/**
* 在方法中进行实体类验证
* */
@RequestMapping(value = "/validated",method = RequestMethod.POST)
@ResponseBody
public ResponseEntity Validated(@RequestBody User user){
Set<ConstraintViolation<User>> violationSet= validator.validate(user);
//如果set.length()不为空,则有参数不符合校验要求
for (ConstraintViolation<User> users:violationSet
) {
System.out.println(users.getMessage());
}
return ResponseEntity.ok(user);
}
}
- 在类名上加上@Validated,这个参数可以告诉 Spring 去校验方法参数。
- 在@RequestBody参数前写上 @Valid,可以校验实体类型的参数
- 可以在直接传参的参数前使用@Email,@NotNull等
- 如果在方法中,需要自己手动校验参数,可以使用validator,在spring Component类中可以AutoWired,别的可以使用工厂获得
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
测试接口:
收工。