@Target({ElementType.METHOD, ElementType.TYPE})
注解的适用范围,可以用在什么地方,超过这个作用范围,编译的时候就会报错
值 | 说明 |
---|---|
ElementType.METHOD | 用于描述方法 |
ElementType.TYPE | 用于描述类、接口(包括注解类型) 或enum声明 |
ElementType.LOCAL_VARIABLE | 用于描述局部变量 |
ElementType.PARAMETER | 用于描述参数 |
ElementType.CONSTRUCTOR | 用于描述构造器 |
ElementType.FIELD | 用于描述域 |
ElementType.PACKAGE | 用于描述包 |
@Retention(RetentionPolicy.SOURCE)
用来修饰注解的,表示注解的生命周期
取值 | 描述 | 作用范围 | 使用场景 |
---|---|---|---|
RetentionPolicy.SOURCE | 表示注解只保留在源文件,当java文件编译成class文件,就会消失 | 源文件 | 只是做一些检查性的操作,,比如 @Override 和 @SuppressWarnings |
RetentionPolicy.CLASS | 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期 | class文件(默认) | 要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife) |
RetentionPolicy.RUNTIME | 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 | 运行时也存在 | 需要在运行时去动态获取注解信息 |
lombok的全参构造函数为例,它的声明周期是源文件
这个注解作用是全参构造函数,可以看到编译后这个注解没了,多了全参构造函数
Spring注解
@NotEmpty、@NotBlank、@NotNull 区别和使用
来源:http://t.csdn.cn/Pp1N1
1:引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
@NotEmpty、@NotBlank、@NotNull 包的位置:
import javax.validation.constraints.*;
2:区别
@NotNull
适用于基本数据类型(Integer,Long,Double等等),当 @NotNull 注解被使用在 String 类型的数据上,则表示该数据不能为 Null(但是可以为 Empty)
注:被其标注的字段可以使用 @size、@Max、@Min 对字段数值进行大小的控制
@NotBlank
适用于 String 类型的数据上,加了@NotBlank 注解的参数不能为 Null 且 trim() 之后 size > 0,必须有实际字符
@NotEmpty
适用于 String、Collection集合、Map、数组等等,加了@NotEmpty 注解的参数不能为 Null 或者 长度为 0
3:使用方法
@Data
public class BigPeople {
@ApiModelProperty(value = "id" ,required = true)
@NotNull(message = "id不能为空")
@Length(message = "id不能超过{max}个长度",max = 10)
private Integer id;
@ApiModelProperty(value = "name" ,required = true)
@NotBlank(message = "name不能为空")
@Size(message = "名字最长为{max} 个字",max = 10)
private String name;
@ApiModelProperty(value = "age" ,required = true)
@NotNull(message = "id不能为空")
@Range(message = "age的长度范围为{min}岁到{max}岁之间",min = 5,max = 10)
private Integer age;
@ApiModelProperty(value = "treeNode" ,required = true)
@NotEmpty(message = "treeNode不能为空")
private List<String> treeNode;
}
@Valid 包位置:
import javax.validation.Valid;
@Validated 包的位置
import org.springframework.validation.annotation.Validated;
@ApiOperation(value = "新增或者修改一个人的信息")
@PostMapping("/updateOrInsert")
public Result updateOrInsert(@Valid @RequestBody Person person){
Boolean updateOrInsert = personService.updateOrInsert(person);
if (updateOrInsert) {
return new Result(ResultCode.SUCCESS,updateOrInsert);
}
return new Result(ResultCode.ERROR, "新增或者修改一个人的信息失败");
}
@ApiOperation(value = "新增或者修改一个人的信息")
@PostMapping("/updateOrInsert")
public Result updateOrInsert(@Validated @RequestBody Person person){
Boolean updateOrInsert = personService.updateOrInsert(person);
if (updateOrInsert) {
return new Result(ResultCode.SUCCESS,updateOrInsert);
}
return new Result(ResultCode.ERROR, "新增或者修改一个人的信息失败");
}
最上面三个注释: 必须需要搭配@Valid 或者@Validated使用,在检验Controller的入参是否符合规范时
@Valid 和 @Validated 比较
1:@Valid 和 @Validated 两者都可以对数据进行校验,待校验字段上打的规则注解(@NotNull, @NotEmpty等)都可以对 @Valid 和 @Validated 生效;
2:@Valid 进行校验的时候,需要用 BindingResult 来做一个校验结果接收。当校验不通过的时候,如果手动不 return ,则并不会阻止程序的执行;
3:@Validated 进行校验的时候,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行,这时需要再写一个全局校验异常捕获处理类,然后返回校验提示。
4:总体来说,@Validated 使用起来要比 @Valid 方便一些,它可以帮我们节省一定的代码,并且使得方法看上去更加的简洁。
此包下其它常用的校验注解:
注解 | 含义 |
---|---|
@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) | 元素必须符合指定的正则表达式 |
@Length @NotEmpty @Range | 1:元素必须是电子邮箱地址 2:字符串的大小必须在指定的范围内 3:字符串必须非空 4:元素必须在合理的范围内 |