【问题标题】:Spring validation of Map as request parameter with annotations使用注释将 Map 作为请求参数的 Spring 验证
【发布时间】:2018-02-05 20:14:00
【问题描述】:

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

@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&lt;String, String&gt; users,其中键是 userId,值是电子邮件。所以我的控制器中有这样的方法:

@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 和其他javax.validation.constraints 注释在此处验证地图值?

【问题讨论】:

    标签: java spring validation spring-mvc


    【解决方案1】:

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

    首先更改您的 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.
        }       
    }
    

    如下所示更改您的控制器。

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

    【讨论】:

    • 谢谢,不错的方法,但我怎样才能发送自定义消息响应而不是他们的约束违规消息?我正在使用休息,所有错误响应应该是相同的
    • 关注此文档:docs.spring.io/spring/docs/current/javadoc-api/org/…。这个全局异常处理程序,因此使用它您可以在通知控制器中处理 MethodArgumentNotValidException.class 异常。例如gist.github.com/matsev/4519323
    • 谢谢!提出了针对自定义错误响应的控制器建议解决方案。还有另一种方法是将BindingResult result 作为额外参数传递给控制器​​方法,检查result.hasErrors() 并返回您的错误响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    相关资源
    最近更新 更多