前后端不可避免的会有日期或者时间戳的交互传递,到底用什么类型进行传递日期好那就见仁见智了,个人还是感觉字符串用着方便,特别有了Java8开始支持的LocalDateTime、LocalDate、以及Spring的ConstraintValidator接口,字符串用起来更是得心应手。
1、首先创建一个注解类
package com.falcon.design.aop.annotation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = {ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateTimeValidator.class)
public @interface DateStrFormat {
String message() default "日期格式错误";
String format() default "yyyy-MM-dd";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2、创建验证该注解的实现类
package com.falcon.design.aop.annotation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.time.format.DateTimeFormatter;
public class DateTimeValidator implements ConstraintValidator<DateStrFormat,String> {
private DateStrFormat dateStrFormat;
@Override
public void initialize(DateStrFormat localDateTime) {
this.dateStrFormat = localDateTime;
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//如果注解的字段为空则不校验,直接返回true
if(value == null || value.length() ==0){
return true;
}
String format = dateStrFormat.format();
//如果被注解字段值的长度和format不一致,则肯定校验不通过返回false
if(value.length() != format.length()){
return false;
}
try{
DateTimeFormatter.ofPattern(format).parse(value);
}catch (Exception e){
return false;
}
return true;
}
}
3、使用

Postman请求:

请求
返回结果:
{
"timestamp": "2020-09-18T18:07:26.808+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"DateStrFormat.user.time",
"DateStrFormat.time",
"DateStrFormat.java.lang.String",
"DateStrFormat"
],
"arguments": [
{
"codes": [
"user.time",
"time"
],
"arguments": null,
"defaultMessage": "time",
"code": "time"
},
{
"arguments": null,
"defaultMessage": "yyyyMMdd HH:mm:ss",
"codes": [
"yyyyMMdd HH:mm:ss"
]
}
],
"defaultMessage": "日期格式错误",
"objectName": "user",
"field": "time",
"rejectedValue": "2020/09/19",
"bindingFailure": false,
"code": "DateStrFormat"
}
],
"message": "Validation failed for object='user'. Error count: 1",
"path": "/hello"
}
可以看到优雅的校验住了字符串类型的时间格式,但是不太优雅的地方在于这个json会原样的返回到前端,并不是前端想要的结果,我们希望只返回字符串类型错误就行了,这个问题我们留在下文探讨。
原创不易,产生共鸣的朋友不妨关注赞赏支持,老衲将不甚感激!
本文介绍了一种使用Java注解及验证器实现日期字符串格式校验的方法。通过自定义注解DateStrFormat结合DateTimeValidator实现对指定格式日期字符串的校验,并展示了如何在Postman中测试该功能。
1867

被折叠的 条评论
为什么被折叠?



