Аннотация для проверки DataSize - PullRequest
0 голосов
/ 04 марта 2020

Есть ли стандартная аннотация валидатора, которую я могу использовать для поля DataSize?

Что-то вроде javax @Min и @Max или Hibernate @DurationMin и @DurationMax.

1 Ответ

1 голос
/ 04 марта 2020

Для класса DataSize стандартного валидатора не существует, поэтому вы должны реализовать свой собственный. Но это довольно просто:)

Интерфейс аннотации:

import org.springframework.util.unit.DataUnit;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = DataSizeMaxValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSizeMax {

    String message() default "must be less than or equal to {value} {unit}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    long value();

    DataUnit unit();
}

Валидатор:

import org.springframework.stereotype.Component;
import org.springframework.util.unit.DataSize;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

@Component
public class DataSizeMaxValidator implements ConstraintValidator<DataSizeMax, DataSize> {
    private DataSize dataSizeMax;

    @Override
    public void initialize(DataSizeMax dataSizeMax) {
        this.dataSizeMax = DataSize.of(dataSizeMax.value(), dataSizeMax.unit());
    }

    @Override
    public boolean isValid(DataSize value, ConstraintValidatorContext context) {
        return dataSizeMax.compareTo(value) >= 0;
    }
}

Вот и все. Затем используйте эту аннотацию как здесь:

import pizza.nikiforov.validators.DataSizeMax;
import org.springframework.util.unit.DataSize;
import org.springframework.util.unit.DataUnit;

public class Data {

    @DataSizeMax(value = 15L, unit = DataUnit.MEGABYTES)
    private DataSize dataSize;

    // other fields
    // constructors, getters and setters
}
...