簡體   English   中英

創建一個拋出 MethodArgumentNotValidException 的驗證方法

[英]Create a validation method which throw MethodArgumentNotValidException

我正在嘗試驗證此 class:

public class RegisterRequest {
    @Email(message = "format e-mail non valide") @NotNull(message = "ne doit pas être vide")
    private String email;
    @NotEmpty(message = "ne doit pas être vide")
    @NotBlank(message = "ne doit pas être vide")
    @NotNull(message = "ne doit pas être vide")
    private String prenom;
    @NotEmpty(message = "ne doit pas être vide")
    @NotBlank(message = "ne doit pas être vide")
    @NotNull(message = "ne doit pas être vide")
    private String nom;
    @Length(min = 13,max = 13 ,message = "doit contenir exactement 13 chiffres")
    @NotNull(message = "ne doit pas être vide")
    @Pattern(regexp = "^\\d*$", message = "ne doit contenir que des chiffres")
    @Pattern(regexp = "^[12]\\w*$", message = "doit commencer par 1 ou 2")
    private String cin;
    @NotNull(message = "ne doit pas être vide")
    @Pattern(regexp = "^(?!.*  .*)[\\d+() ]{9,20}$", message = "ne doit contenir que des chiffres , des parentheses et plus")
    @Length(min = 9,max = 20)
    private String telephone;
    @NotNull(message = "ne doit pas être vide")
    @Length(min = 5,max = 20,message = "la taille de caractère doit être entre 5 et 20")
    @Pattern(regexp = "^(?=[a-zA-Z\\d._-]*$)(?!.*[_.]{2})[^_.].*[^_.]$",message = "ne doit contenir de caractère special  a part _ , .,-")
    private String login;
}

像這樣使用 ObjectMapper 構建之后:

@Slf4j
public class CustomValidator {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    public Boolean validate(Object object){
        Set<ConstraintViolation<Object>> violations = validator.validate(object);
        log.info(violations.toString());
        String errorMessage =
                violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(", "));
        throw new MethodArgumentNotValidException(errorMessage);
    }
}

如您所見,我不能在這里使用@Valid注釋(注意:如果有直接使用注釋的方法,我會更喜歡它。但我沒有找到任何方法來做到這一點。
所以我發現最好創建一個驗證器 class 所以經過一些研究我發現了這個方法

 MethodParameter parameter, BindingResult bindingResult

但在他的構造函數中使用兩個參數是行不通的:
 MethodParameter parameter, BindingResult bindingResult

所以我的問題是如何創建這個參數以及如何像@Valid一樣拋出它或者是否有任何其他方法來處理驗證錯誤

所以,我找到了這個解決方案,但我不再拋出 MethodArgumentNotValidException 我已經創建了自己的異常 class ,如下所示:

@Getter @Setter
public class ArgumentValidationExption extends Exception{
    private final Map<String, String> errors;
    public ArgumentValidationExption(Map<String,String> errors) {
        super();
        this.errors = errors;
    }

@ExceptionHandler(ArgumentValidationExption.class)
    public ResponseEntity<?> ArgumentInvalid(ArgumentValidationExption arg){
        return jsonResponse(false,arg.getErrors(),400,arg.getClass().getSimpleName());
    }

在我的驗證器 class 中,我只是像這樣拋出異常:

public void validate(Object object) throws ArgumentValidationExption {
        Set<ConstraintViolation<Object>> violations = validator.validate(object);
        if (violations.size() == 0 ) return ; 
        Map<String, String> errors = new HashMap<>();

        for (ConstraintViolation<Object> constraint: violations
             ) {
            errors.put(constraint.getPropertyPath().toString(), constraint.getMessageTemplate());
        }
        throw new ArgumentValidationExption(errors);
        
    }
}

如果您找到更好的解決方案,請告訴我

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM