[英]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;
}
@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.