关于Spring MVC参数校验,可以分为两种情况讨论:针对普通请求参数的校验和针对请求体中的JSON格式数据的校验。这里我们主要讲解后者,即针对@RequestBody
注解返回400
错误时的问题。
1. 报错原因
在开发中,当我们使用@RequestBody
注解接收请求体中的JSON格式数据时,经常会遇到传入的参数格式不正确的情况,比如类型不匹配、缺失必要的参数等。
而在这种情况下,Spring MVC会抛出一个MethodArgumentNotValidException
异常,但实际上我们期望的应该是HTTP状态码为400
的错误信息返回给前端,告知请求参数不合法。
2. 解决方式
为了解决这一问题,我们需要在Controller中添加一个ExceptionHandler
来捕获该异常,然后返回自定义的Map
格式的错误信息。
具体做法如下:
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理实体参数校验不通过异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
BindingResult bindingResult = ex.getBindingResult();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
Map<String, Object> errorMap = new HashMap<>(16);
for (FieldError error : fieldErrors) {
errorMap.put(error.getField(), error.getDefaultMessage());
}
return errorMap;
}
}
在上述代码中,我们使用了@ExceptionHandler
注解来标记该方法为异常处理方法,其中参数为MethodArgumentNotValidException
类,其表示实体参数校验不通过时抛出的标准异常。从而实现了对该异常的捕获。
在方法体中,我们首先通过ex.getBindingResult()
方法获取到校验结果,进而获取到所有的错误信息。然后,将错误信息存放在一个Map
对象中,最后返回即可。
3. 示例
针对上述方法,我们可以通过两个示例来进一步讲解。
首先,在Controller中定义如下方法来演示参数校验:
@PostMapping("/test")
public String test(@RequestBody @Valid User user) {
return "success";
}
该方法使用@PostMapping
注解标记为一个POST类型的请求,使用了@RequestBody
注解来接收JSON格式的请求体,同时也使用了@Valid
注解来表示需要校验该参数。
而User
类定义如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
@NotNull(message = "年龄不能为空")
@Max(value = 100, message = "年龄不能超过100岁")
private Integer age;
}
可以看到,在User
类中,我们使用了JSR-303提供的注解来对参数进行校验,其中@NotBlank
注解表示参数不能为空,@NotNull
注解表示参数不能为null,@Max
注解表示参数必须小于等于100。
针对以上代码,我们可以进行两次请求进行测试。
- 传入参数正确的请求
{
"username": "张三",
"age": 22
}
收到的响应如下:
success
响应正常,说明参数校验通过。
- 传入参数错误的请求
{
"username": "",
"age": "22"
}
此时会收到一个400
状态码的信息,其中包含了所有的错误信息,如下所示:
{
"username": "用户名不能为空",
"age": "不能为null"
}
从中我们可以看到,该请求存在两个错误:username
参数不能为空,而age
参数不能为null。由此可以得出,我们成功地实现了对请求体中JSON格式数据的参数校验处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring MVC参数校验详解(关于`@RequestBody`返回`400`) - Python技术站