@ValidTaskDTO
public class TaskDTO {
@FutureOrPresent
private ZonedDateTime dueDate;
@NotBlank(message = "Title cannot be null or blank")
private String title;
private String description;
@NotNull
private RecurrenceType recurrenceType;
@Future
private ZonedDateTime repeatUntil;
}
型
自定义标注:
@Constraint(validatedBy = {TaskDTOValidator.class})
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidTaskDTO {
String message() default "Due date should not be greater than or equal to Repeat Until Date.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
型
约束验证器:
public class TaskDTOValidator implements ConstraintValidator<ValidTaskDTO, TaskDTO> {
@Override
public void initialize(ValidTaskDTO constraintAnnotation) {
}
@Override
public boolean isValid(TaskDTO taskDTO, ConstraintValidatorContext constraintValidatorContext) {
if (taskDTO.getRecurrenceType() == RecurrenceType.NONE) {
return true;
}
return taskDTO.getRepeatUntil() != null && taskDTO.getDueDate().isBefore(taskDTO.getRepeatUntil());
}
}
public static class VehicleDto {
private String type;
private Car car;
private Bike bike;
@AssertTrue(message = "You must inform either car or bike, but not both")
private boolean isValidVehicle() {
return (car != null && bike == null) || (car == null && bike != null);
}
}
3条答案
按热度按时间cgyqldqp1#
在类中有两个字段,而其中只有一个可以呈现,对我来说似乎是一种设计气味。但是如果你坚持这样的设计-你可以为你的
VehicleDto
类创建一个自定义的Validator。字符串
另外,请参阅Spring文档中关于验证的内容:
mnemlml82#
例如,如果我们想检查
TaskDTO
对象是否有效,通过比较它的两个属性dueDate
和repeatUntil
,下面是实现它的步骤。pom.xml中的依赖项:
字符串
DTO类:
型
自定义标注:
型
约束验证器:
型
确保在RestController中的postmapping方法的RequestBody前面有
@Valid
。只有这样验证才会被调用:型
我希望这对你有帮助。如果你需要关于步骤的详细解释,请看this video
w6mmgewl3#
如果使用spring-boot-starter-validation,可以像
字符串