如何实现RegisterRequest校验并抛出MethodArgumentNotValidException
如何构造MethodArgumentNotValidException或替代的校验错误处理方案
需要校验的实体类
我需要校验以下RegisterRequest类:
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; }
当前Controller实现
目前我通过ObjectMapper将@RequestParam接收的Map<String,Object>转换为该类实例,代码如下:
@PostMapping("/register") public ResponseEntity<?> register( @RequestParam("file") MultipartFile file, @RequestParam Map<String,Object> req ) throws UserNotFoundException, EntreeException, RoleNotFoundException, IOException { ObjectMapper mapper = new ObjectMapper(); RegisterRequest registerRequest = mapper.convertValue(req,RegisterRequest.class); return controllerResponse(registerRequest,""); }
这里无法直接使用@Valid注解(如果存在直接使用@Valid的可行方案,我更倾向采用,但尚未找到),因此尝试编写自定义校验器。
尝试的自定义校验器
参考资料后写出如下方法:
@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); } }
但该方法无法运行,因为MethodArgumentNotValidException的构造器需要两个参数:
MethodParameter parameter, BindingResult bindingResult
问题
如何构造这两个参数并像@Valid那样抛出该异常,或是有其他处理校验错误的可行方式?
内容的提问来源于stack exchange,提问作者Youtech code
相关产品推荐
相关产品推荐

