繁体   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