I use javax.validation.constraints annotations to validate the request parameters. I need to validate emails so I've created an annotation @EmailValid, snippet provided below:
@Email(message = "Please provide a valid email address")
@Pattern(regexp = ".+@.+\\..+", message = "Please provide a valid email address")
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Documented
public @interface EmailValid {
String message() default "Please provide a valid email address";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
But it works only for single String field e.g. :
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/sendEmail", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseVO> sendEmail(@EmailValid String email) {
// some code for sending email
}
What I need is to validate Map of emails. I have a map Map<String, String> users where key is userId and value is an email. So I have a method like this in my controller:
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/sendEmails", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseVO> sendEmails(Map<String, String> users) {
// some code for sending email
}
Question is how can I validate map values here using my annotation @EmailValid and other javax.validation.constraints annotations?
You have to implement custom validation like below.
First Change your EmailValid.java file.
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = { EmailValidCheck.class })
@Documented
public @interface EmailValid {
String message() default "Please provide a valid email address";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Now Implement This ConstraintValidator like Below.
public class EmailValidCheck extends ABaseController implements
ConstraintValidator<EmailValid, Map<String,String>> {
@Override
public void initialize(EmailValid constraintAnnotation) {
}
@Override
public boolean isValid(Map<String,String> mapOfEmail,
ConstraintValidatorContext cvc) {
//Implement Email Validation Login Here.
}
}
Change Your Controller Like Below.
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/sendEmails", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseVO> sendEmails(@EmailValid Map<String, String> users) {
// some code for sending email
}
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