前端传参做校验,javax.validation.constraints为我们提供了很多注解来帮忙我们做参数校验。
一、javax.validation.constraints包的注解
导包
pom.xml中引入下面的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
使用
@Null / @NotNull
@NotNull(message = "最大数,不能为空")
校验参数⼀定不能为null,但是可以为" "。
@Null(message = "必须为空")
标注的属性值必须为空
@NotEmpty
@NotEmpty(message = "地址不能为NULL")
校验集合类参数(如String类、Collection、Map、数据Array)不能为null或empty。其中String的length、Collection和Map的size不能为0。
@NotBlank
@NotBlank(message = "ID,不能为空")
校验String字符串不能为null,且去除两端空⽩字符后的长度⼤于 0,即调⽤trim()之后字符串的长度⼤于0。
@NotEmpty除了@NotNull之外还需要保证@Size(min=1),这也是⼀个注解,这⾥规定最⼩长度等于1,也就是类似于集合⾮空。
@Size
@Size(max = 10, min = 5, message = "修饰的字段长度要在5-10之间")
private String size;
@Positive / @Negative
@Negative(message = "负数")
@Positive(message = "整数")
@PositiveOrZero / @NegativeOrZero
@PositiveOrZero(message = "0或者正数")
@NegativeOrZero(message ="0或者负数")
校验参数必须是正整数或0。
@Pattern
参数验证------正则验证
@Pattern(regexp = "正则表达式",message = "不满⾜正则表达式
@Pattern(regexp = "^.{1,10}$", message = "名称,至多10位字符")
@Pattern(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$", message = "不满足邮箱正则表达式")
@Digits
被注释的元素必须是⼀个数字,验证数字的整数位和小数位的位数是否超过指定的长度
@Digits(integer = 7, fraction = 2, message = "最大库存,允许8位整数,2位小数")
@Max / @Min
被注释的元素必须是⼀个数字,其值必须⼤于/小于等于指定的最⼩值
@Max(value = 20, message = "最大长度为20")
@Min(value = 1, message = "最小长度为1")
@DecimalMax / @DecimalMin
被注释的元素必须是⼀个数字(小数值),其值必须⼤于/小于等于指定的最⼩值
@DecimalMax(value = "12.35")
// @DecimalMin(value = "1.24")
private double money;
@AssertFalse / @AssertTrue
被注解的元素类型为boolean且必须为false / true,验证才能通过
@AssertTrue(message = "必须为true")
@AssertFalse(message = "必须为false")
private boolean status;
@Range
被注释的元素必须在合适的范围内,用于指定数字,注意是数字的范围,有两个值,min以及max
@Range(min = 1, max = 888, message = "范围为1至888") // 限定范围
private Long range;
// 邮箱验证
@Email(message = "邮箱格式错误")
private String email;
@Past / @Future
@Past 被注释的元素必须是⼀个过去的⽇期
@Future 被注释的元素必须是⼀个将来的⽇期
@Future(message = "时间在当前时间之后才可以通过")
@Future(message = "需要一个将来日期") // 只能是将来的日期
// @Past //只能去过去的日期
@DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式化转换
@NotNull // 不能为空
private Date date;
@PastOrPresent / @FutureOrPresent
@PastOrPresent(message = "过去或者现在的时间")
@FutureOrPresent(message = "将来或者现在的时间")
Controller层
1). 开启校验功能@Valid,校验错误后有默认的响应(框架配置⽂件中设置)
2). 给校验的bean后紧跟⼀个BindingResult,就可以获取到校验的结果。
3). 按需封装⾃⼰的返回数
@PostMapping("/deal")
@ApiOperation("处理")
public R deal (@RequestBody @Validated InfoDTO infoDTO, BindingResult results)throws Exception{
if (results.hasErrors()) {
//获取并返回自定义错误提⽰语
return R.error(-1, results.getFieldError().getDefaultMessage());
}
try {
// 业务层
R r=Service.deal(infoDTO);
return r;
} catch (Exception e) {
return R.error(-1, "失败,请刷新页面重试!");
}
}
二、@JsonFormat、@JSONField、@DateTimeFormat
1、@DateTimeFormat:
因为其用法比较单一,只用于将字符串格式化成日期,在加入spring以后,直接使用注解@DateTimeFormat(pattern=”yyyy-MM-dd”)即可。@DateTimeFormat 注解有3个可选的属性:style,pattern和iso。
属性style: 允许我们使用两个字符的字符串来表明怎样格式化日期和时间。第一个字符表明了 日期的格式,第二个字符表明了时间的格式。下面的表格中列出了可用的选择以及相应的输出的例子:
描述 字符串值 示例输出
Tables Are Cool
短格式(这是缺省值) SS 8/30/64 11:24 AM
中等格式 MM Aug 30, 1964 11:24:41 AM
长格式 LL August 30, 1964 11:24:41 AM CDT
完整格式 FF Sunday, August 30,1964 11:24:41 AM CDT
使用短横线省略日期或时间 M- Aug 30, 1964
Pattern: 属性允许我们使用自定义的日期/时间格式。该属性的值遵循java标准的date/time格式规范。缺省的该属性的值为空,也就是不进行特殊的格式化。通常情况下我们都是使用这个 注解做自定义格式化的。
iso: 基本上用不上,这里不做讲解
2、@JsonFormat
用法 为在属性值上 @JsonFormat(pattern= “yyyy-MM-dd”,timezone=”GMT+8”),如果直接使用 @JsonFormat(pattern=”yyyy-MM-dd”)就会出现2018-08-01 08:00:00的情况, 会相差8个小时,因为我们是东八区(北京时间)。所以我们在格式化的时候要指定时区(timezone )
@JsonFormat(pattern = “yyyy-MM-dd’T’HH:mm:ss.SSSZ”, locale = “zh”, timezone = “GMT+8”)
- pattern 指定转化的格式SSSZ(S指的是微秒,Z指时区),此处的pattern和java.text.SimpleDateFormat中的Time Patterns一致
- locale主要指语言,如果中文的话,月份输出是五月,但是英文就是May,尤其是在反序列化的时候特别重要
- timezone主要解决“8小时”问题
3、@JSONField
用法:目前最长的用属性是@JSONField(name=”resType”)和 @JSONField(format=”yyyy-MM-dd”)
name:@JSONField(name=”resType”)主要用于指定前端传到后台时对应的key值,如果bean中没有这个注解,则默认前端传过来的key是field本身,即如果是private String name,name前端对应的key就是name才能对应上。
format @JSONField(format=”yyyy-MM-dd”)主要用于格式化日期,比如前台传过来的时间是2018-07-12 17:44:08,但是通过这个注解,你存到数据库的时间就是2018-07-12 00:00:00.
区别
1)后端返回前端时使用,主要用于后台传值到前台
一、出参格式化:@JSONField是阿里巴巴下fastjson下的,@JsonFormat是jackson下面的。
- @JsonFormat(pattern = “yyyy-MM-dd”,timezone = “GMT+8”)
注意:需要加时区,不然相差8小时 - @JSONField(format = “yyyy-MM-dd”)
2)前台传后台时使用,主要用于后台接受前台的值
二、入参格式化:可以使用 Spring 的 @DateTimeFormat 注解格式化参数,将字符串格式化成日期,来解决上述问题。
@DateTimeFormat(pattern=“yyyy-MM-dd”)
例子:
@JsonFormat(locale=“zh”, timezone=“GMT+8”, pattern=“yyyy-MM-dd HH:mm:ss”)
@DateTimeFormat
@ApiModelProperty(value = “有效结束日期”)
private Date enddate;