Annotation for DataSize validation

whistling_marmot :

Is there any standard validator annotation I can use for a DataSize field?

Something like javax @Min and @Max, or Hibernate's @DurationMin and @DurationMax.

nikiforovpizza :

For class DataSize, there's no standard validator, so you should implement your own. But it's quite easy :)

Annotation interface:

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

Validator:

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

That's it. Then use this annotation as here:

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
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=25110&siteId=1