Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring validation of Map as request parameter with annotations

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?

like image 886
vikki Avatar asked Dec 19 '25 11:12

vikki


1 Answers

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
    }
like image 81
vikas Avatar answered Dec 21 '25 00:12

vikas



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!