MethodArgumentNotValidException
MethodArgumentNotValidException 是 Java 中用于处理方法参数不合法情况的异常,通常在使用 Java 的验证框架(如 Hibernate Validator、Bean Validation 等)时出现,用于确保方法的输入参数满足预设的约束条件。
作用
- 参数验证:该异常的核心作用是对方法的输入参数进行合法性检查。当参数不满足预设的验证规则时,就会抛出此异常,从而避免因非法参数导致的程序错误或异常行为。这些验证规则可以涵盖数据类型检查、长度限制、正则表达式匹配等多种类型。
- 提高程序健壮性:通过及时抛出 MethodArgumentNotValidException异常,能够防止非法参数进入业务逻辑处理流程,减少程序出现不可预期的错误,增强程序的健壮性和稳定性。
- 提供错误信息:异常中包含了详细的错误信息,如哪些参数不合法以及具体的错误原因,这些信息可以帮助开发人员快速定位问题,同时也方便向调用者提供清晰的错误反馈。
通俗的使用场景
1. 表单数据验证
在 Web 应用程序中,当用户提交表单数据时,需要对表单中的各个字段进行验证。例如,用户注册表单可能包含用户名、密码、电子邮件等字段。可以使用 @Valid (这个注解来自hibernate中validator依赖)注解对这些字段进行验证,如果用户输入的数据不符合要求,就会抛出 MethodArgumentNotValidException 异常。示例代码如下:
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    @PostMapping("/register")
    public String registerUser(@Valid @RequestBody UserRegistrationRequest request) {
        // 用户注册逻辑
        return "注册成功";
    }
}
class UserRegistrationRequest {
    @NotBlank(message = "用户名不能为空")
    @Size(min = 2, max = 6, message = "用户名长度要求在2 - 6之间")
    private String username;
    @NotBlank(message = "密码不能为空")
    @Size(min = 6, message = "密码长度至少为6个字符")
    private String password;
    @NotBlank(message = "电子邮件不能为空")
    @Email(message = "电子邮件格式不正确")
    private String email;
    // Getters and Setters
}
当用户提交的表单数据中用户名为空、密码长度不足或电子邮件格式无效时,就会触发 MethodArgumentNotValidException 异常。
2. API 接口参数验证
在开发 RESTful API 时,客户端会向服务器发送包含各种参数的请求。为了确保 API 的正确性和安全性,需要对请求参数进行验证。例如,一个获取用户信息的 API 可能需要传入用户的 ID,此时可以使用 @Valid 注解对请求参数进行验证。如果请求参数不合法,就会抛出 MethodArgumentNotValidException 异常。
import javax.validation.constraints.Min;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    @GetMapping("/users/{id}")
    public String getUser(@PathVariable @Min(value = 1, message = "用户 ID 必须大于 0") Long id) {
        // 根据用户 ID 获取用户信息的逻辑
        return "用户信息";
    }
}
当客户端传入的用户 ID 小于等于 0 时,就会触发 MethodArgumentNotValidException 异常。
3. 对象属性验证
当方法的参数是一个对象时,也可以对该对象的属性进行验证。例如,上述的 UserRegistrationRequest 类中的各个属性都可以使用验证注解进行约束。如果对象的某个属性不满足验证规则,同样会抛出 MethodArgumentNotValidException 异常。
读到这里肯定还是只知道这个异常类的作用和普遍的使用场景,那到底有哪些常用的方法呢,请往下看:
- getBindingResult():该方法用于获取校验结果对象- BindingResult,通过它可以进一步获取详细的校验错误信息。- BindingResult包含了所有校验失败的信息,如错误字段、错误原因等。示例代码如下:
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
public class ExampleController {
    public void handleValidationException(MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        // 处理校验结果
    }
}
- getFieldErrors():此方法返回一个- List<FieldError>,其中包含了所有字段的校验错误信息。每个- FieldError对象代表一个字段的校验错误,可通过它获取字段名和对应的错误信息。示例代码如下:
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
public class ExampleController {
    public void handleValidationException(MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            String fieldName = fieldError.getField();
            String errorMessage = fieldError.getDefaultMessage();
        }
    }
}
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号