Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Request Constraint Validator, set error message

I created a constraint request validator. How do I set the String message in each if else condition, so the user can see specific details? I am trying to access this.message() and change the default .

@Constraint(validatedBy = ProductExportFiltersValidator.class)
@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Documented
public @interface ProductExportFiltersConstraint {
    String message() default "Invalid product export filters.";
    Class <?> [] groups() default {};
    Class <? extends Payload> [] payload() default {};
}

public class ProductExportFiltersValidator implements ConstraintValidator<ProductExportFiltersConstraint, ProductExportFilters> {
    @Override
    public void initialize(ProductExportFiltersConstraint constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }
   
    @Override
    public boolean isValid(ProductExportFilters productExportFilters, ConstraintValidatorContext constraintValidatorContext) {
        if (productExportFilters == null) {
            return false;
        }
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_DATE_TIME;
            LocalDateTime startDate = null;
            LocalDateTime endDate = null;
            if (productExportFilters.getStartDate() != null) {
                startDate = LocalDateTime.from(dateTimeFormatter.parse(productExportFilters.getStartDate()));
            }
            if (productExportFilters.getEndDate() != null) {
                endDate = LocalDateTime.from(dateTimeFormatter.parse(productExportFilters.getEndDate()));
            }
            if (startDate == null && endDate == null) {
                return true;
            }
            if ((startDate != null && endDate == null) ||
                    (startDate == null && endDate != null)) {
                return false;
            }
            return startDate.equals(endDate) || startDate.isBefore(endDate);
        } catch (DateTimeException e) {
            return false;
        }
    }
like image 528
mattsmith5 Avatar asked Mar 01 '26 04:03

mattsmith5


1 Answers

You can use ConstraintValidatorContext.buildConstraintViolationWithTemplate() to set message different from the one defined in message(). You use it like this:

context.buildConstraintViolationWithTemplate("some message").addConstraintViolation();

In your validator:

public class ProductExportFiltersValidator implements ConstraintValidator<ProductExportFiltersConstraint, ProductExportFilters> {

    @Override
    public boolean isValid(ProductExportFilters productExportFilters, ConstraintValidatorContext constraintValidatorContext) {
        if (productExportFilters == null) {
            constraintValidatorContext.buildConstraintViolationWithTemplate("missing filters").addConstraintViolation();
            return false;
        }
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_DATE_TIME;
            LocalDateTime startDate = null;
            LocalDateTime endDate = null;
            if (productExportFilters.getStartDate() != null) {
                startDate = LocalDateTime.from(dateTimeFormatter.parse(productExportFilters.getStartDate()));
            }
            if (productExportFilters.getEndDate() != null) {
                endDate = LocalDateTime.from(dateTimeFormatter.parse(productExportFilters.getEndDate()));
            }
            if (startDate == null && endDate == null) {
                return true;
            }
            if ((startDate != null && endDate == null) ||
                    (startDate == null && endDate != null)) {
                constraintValidatorContext.buildConstraintViolationWithTemplate("your detailed message").addConstraintViolation();
                return false;
            }
            return startDate.equals(endDate) || startDate.isBefore(endDate);
        } catch (DateTimeException e) {
            constraintValidatorContext.buildConstraintViolationWithTemplate("invalid dates format").addConstraintViolation();
            return false;
        }
    }
}
like image 173
Chaosfire Avatar answered Mar 02 '26 18:03

Chaosfire