2017-08-28 115 views
1

我使用javax.validation.constraints批注验证请求参数。我需要验证电子邮件,所以我创建了一个注释@EmailValid,摘要如下规定:使用注释验证映射为请求参数

@Email(message = "Please provide a valid email address") 
@Pattern(regexp = "[email protected]+\\..+", 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<String, String> users其中key是userId,value是一封电子邮件。所以我有这样的方法在我的控制器:

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

问题是我怎么可以验证使用我的注释@EmailValidjavax.validation.constraints注解这里映射值?

回答

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 
    } 
+0

谢谢你,漂亮的做法,但我怎么能发送自定义消息响应,而不是他们的约束冲突的消息?我正在使用休息,所有错误响应应该是相同的 – user3872496

+0

请按照以下文档:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice。 html。这个全局异常处理程序,所以使用这个你可以在建议控制器中处理MethodArgumentNotValidException.class异常。例如https://gist.github.com/matsev/4519323 – vikas

+0

谢谢!想出了自定义错误响应的控制器建议解决方案。还有一种方法是将'BindingResult result'作为额外参数传递给控制器​​方法,检查'result.hasErrors()'并返回错误响应。 – user3872496