您的位置:首页 > 编程语言 > Java开发

SpringBoot基础教程2-1-8 数据验证-自定义日期格式验证

2018-08-08 10:23 477 查看

1 概述

javax.validation
包与
hibernate-validator
包中注解能满足大部分需求,但是还是有必要熟悉下自定义数据验证注解,如日期格式验证

2 添加依赖

<dependencies>
<!-- 唯一需要依赖,默认就内嵌了Tomcat容器,如需要更换容器Jetty、Undertow也极其简单-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--该依赖只会在编译时调用-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
</dependencies>

3 自定义注解

定义一个
@DateTime
注解

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateTimeValidator.class)
public @interface DateTime {

String message() default "格式错误";

String format() default "yyyyMM";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}


@Constraint
,指定校验类

message
,失败提示信息

groups
,分组验证(后面介绍)

payload
,不知道,欢迎留言探讨

4 实现具体验证类

public class DateTimeValidator implements ConstraintValidator<DateTime, String> {
private DateTime dateTime;

@Override
public void initialize(DateTime dateTime) {
this.dateTime = dateTime;
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 如果 value 为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离
if (value == null) {
return true;
}
String format = dateTime.format();

if (value.length() != format.length()) {
return false;
}

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);

try {
simpleDateFormat.parse(value);
} catch (Exception e){
return false;
}
return true;
}
}

实现
ConstraintValidator
接口,定义
initialize
isValid
方法。

initialize
,主要用于初始化,它可以获得当前注解的所有属性

isValid
,进行约束验证的主体方法,其中
value
就是验证参数的具体实例,
context
代表约束执行的上下文环境。

5 实体类

@Data
public class User {

@NotNull(message = "名字不能为空")
@Length(min = 4, max = 10, message = "name 长度必须在 {min} - {max} 之间")
private String name;

@NotNull(message = "生日不能为空")
@DateTime(format = "yyyyMMdd", message = "格式错误,正确格式为:yyyyMMdd")
private String birthday;
}

6 控制层

@RestController
public class UserController {

@PostMapping("/user")
public R addUser(@Validated @RequestBody User user, BindingResult br) {

if (br.hasErrors()) {
return R.isFail().msg(br.getFieldError().getDefaultMessage());
} else {

return R.isOk().data(user);
}
}
}

7 测试结果



8 工程目录



9 结束语

说点什么呢,有任何建议,欢迎留言探讨,本文源码

欢迎关注博主公众号,第一时间推送最新文章

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息