一个实体类中有开始时间属性和结束时间属性,如何使用springboot校验结束时间属性要大于开始时间属性
public boolean test(Date dateStart, Date dateEnd) {
return dateStart.before(dateEnd);
}
没有这么便利的注解的。要实现这个功能也很简单。
首先,要明确一个知识点,springboot中对实体类属性赋值是通过反射调用各个属性的set方法。
那么要做的就很简单了。
在setStartDate
与setEndDate
方法中加入如下判断
public void setStartDate(Date startDate){
if (this.endDate!=null && this.endDate.before(startDate)){
throw new RuntimeException("开始时间不能早于结束时间");
}
this.startDate = startDate;
}
public void setEndDate(Date endDate){
if (this.startDate!=null && endDate.before(this.startDate)){
throw new RuntimeException("开始时间不能早于结束时间");
}
this.endDate = endDate;
}
用validated 扩展自定义校验逻辑,在原生的校验注解基础上,再次扩展
@Data
public class PagedQueryDto {
@Min(value = 1, message = "页码不能小于1")
protected Integer page;
@Min(value = 10, message = "分页不能小于10")
protected Integer limit;
}
可以使用springboot集成hibernate框架,自定义注解实现。参考链接:
springboot中注解校验@Valid@Validated(亲测有效)_卖柴火的小伙子的博客-CSDN博客
下面提供一个简单的demo说明实现过程。关于框架校验更多内容可以看一下上面的博客,写得很详细了。
需要导入依赖:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>
自定义注解:
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {TimeValidator.class })
public @interface TimeValid {
// 约束异常模板消息
String message() ;
// 约束指定可指定的分组
Class<?>[] groups() default { };
// 指定与约束声明相关联的有效负载
Class<? extends Payload>[] payload() default { };
}
自定义注解实现类:
public class TimeValidator implements ConstraintValidator<TimeValid,TimeInfo> {
@Override
public void initialize(TimeValid constraintAnnotation) {
}
@Override
public boolean isValid(TimeInfo value, ConstraintValidatorContext context) {
// 开始时间与结束时间比较,如果开始时间大于结束时间则校验失败
if(LocalDate.parse(value.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd"))
.compareTo(LocalDate.parse(value.getEndtTime(),DateTimeFormatter.ofPattern("yyyy-MM-dd")))>0){
return false;
}
return true;
}
}
测试对象:
@TimeValid(message = "开始时间不能大于结束时间")
public class TimeInfo {
private String startTime;
private String endtTime;
// 省略get/set
}
测试请求方法:
@RequestMapping("/test")
@RestController
public class TestTimeController {
@PostMapping("/addTime")
public void addTime(@RequestBody @Validated TimeInfo timeInfo){
// 执行新增操作
int a=0;
System.out.println(timeInfo);
}
}
测试案例请求参数:
测试案例返回结果信息: