2017-08-28 55 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