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