Spring Boot请求正文验证

时间:2020-06-27 14:49:31

标签: spring-boot rest validation

我正在使用Spring REST API,并具有以下控制器:

@RestController
@RequestMapping(
        value = "/api/Test",
        produces = "application/json"
)
public class MyController {

    @RequestMapping(method = RequestMethod.POST)
    public Response serviceRequest(@Valid @RequestBody ServiceRequest myServiceRequest)  {    
             ....    
    }
}

ServiceRequest具有以下结构:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ServiceRequest {

    @NotBlank
    private LocalDate fromDate;

    @NotBlank
    private LocalDate toDate;

}

我的任务是基于fromDate和toDate字段值的组合引入验证:如果它们之间的时间段长于1周,则验证应该失败。

请问最好的存档方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以创建一个自定义约束验证器,以在处理请求之前验证所需条件。

DatesDifference.java

@Constraint(validatedBy = DatesDifferenceValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DatesDifference {
    String message() default "Dates difference is more than a week";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

DatesDifferenceValidator.java

@Component
public class DatesDifferenceValidator implements ConstraintValidator<DatesDifference, ServiceRequest> {
    
    @Override
    public boolean isValid(ServiceRequest serviceRequest, ConstraintValidatorContext context) {
        System.out.println("validation...");
        if (!(serviceRequest instanceof ServiceRequest)) {
            throw new IllegalArgumentException("@DatesDifference only applies to ServiceRequest");
        }
        LocalDate from = serviceRequest.getFromDate();
        LocalDate to = serviceRequest.getToDate();

        long daysBetween = ChronoUnit.DAYS.between(from, to);
        System.out.println("daysBetween "+daysBetween);
        return daysBetween <= 7;
    }
}

ServiceRequest.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@DatesDifference
public class ServiceRequest {
    @NotBlank
    private LocalDate fromDate;

    @NotBlank
    private LocalDate toDate;
}