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;
}
}
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;
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With