java - Spring 将 Map 验证为带有注释的请求参数

标签 java spring validation spring-mvc

我使用 javax.validation.constraints用于验证请求参数的注释。我需要验证电子邮件,所以我创建了一个注释 @EmailValid ,下面提供的片段:

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

但它仅适用于单个字符串字段,例如:

@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/sendEmail", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<ResponseVO> sendEmail(@EmailValid String email) {
        // some code for sending email
    }

我需要的是验证电子邮件 map 。我有一张 map Map<String, String> users其中键是 userId,值是电子邮件。所以我的 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
    }

问题是如何使用我的注释 @EmailValid 验证此处的 map 值及其他javax.validation.constraints注释?

最佳答案

您必须像下面这样实现自定义验证。

首先更改您的 EmailValid.java 文件。

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

现在像下面这样实现这个 ConstraintValidator。

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

像下面这样更改您的 Controller 。

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

关于java - Spring 将 Map 验证为带有注释的请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45921026/

相关文章:

Java——如何高效地存储大量String数组

java.lang.IllegalAccessError : org. apache.commons.dbcp.DelegatingPreparedStatement.isClosed()Z

spring - 使用 Autowiring 的 MockHttpServletRequest 进行的多次测试不起作用?

spring - 使用 Bean ID 的属性占位符

java - 用于无效 Json 字符串的 Jersey 自定义异常映射器

java - com.jcraft.jsch.JSchException : channel is not opened when opening a channel in jsch 错误

java - java中的百分比函数

java - 字符串分词器和管道符号

c# - 如何使自定义控件可验证?

javascript - 如何使用 JavaScript 验证一种表单中的两组单选按钮?