springboot校验

一个实体类中有开始时间属性和结束时间属性,如何使用springboot校验结束时间属性要大于开始时间属性


public boolean test(Date dateStart, Date dateEnd) {
        return dateStart.before(dateEnd);
    }

没有这么便利的注解的。要实现这个功能也很简单。
首先,要明确一个知识点,springboot中对实体类属性赋值是通过反射调用各个属性的set方法。
那么要做的就很简单了。
setStartDatesetEndDate方法中加入如下判断

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);

    }
}

测试案例请求参数:

img

测试案例返回结果信息:

img


如有帮助,欢迎采纳!