You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:10:12