在SpringBoot项目中优雅地进行参数校验(一)
2020-02-14 本文已影响0人
我永远喜欢御坂美琴
前言:
楼主在这几天做小功能的时候,在控制层的参数校验的代码占了很大的篇幅,交智商税不说,还严重影响代码可读性。在接下来的几篇文章中,楼主将展示如何优雅地进行参数校验工作,工作中“代码五分钟,摸鱼两小时”不是梦(手动滑稽)。
一.实体类
这里先创建一个简单的实体类
@Data
@JsonInclude(value= JsonInclude.Include.NON_NULL)
public class MyUser {
@NotEmpty
@NotNull
private String id;
@NotNull
@NotEmpty
private String name;
@NotNull
@NotEmpty
@Email
private String email;
private String message;
}
在前端传来的数据时,我们必须对其数据进行数据的校验,就上面来说,传过来的用户id不能为空,也不能为空字符;用户名也一样;邮箱地址的也许要进行空和空字符验证,而且还需要判断邮箱地址符不符合邮件的格式。在这里,我们使用javax.validation.constraints包下的注解,(其他的注解这里就不列出来了,可以上网自行查找或者查看源码)以上标在实体类上的注解从字面就能明白注解的意思,注解需标在实体类的成员变量上。
二.控制层
我们写一个简单的控制层,检查注解是否生效
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public ResultVo addUser(@RequestBody @Vail MyUser myuser ){
//...
}
}
在控制层中新建了一个addUser方法,前端使用Post请求发送的json数据将会被自动填装到myuser对象中,此时使用@Vail注解便能开启对传入数据的校验,换言之就是使得实体类MyUser中成员变量上标注的注解生效
三.异常拦截器
当我们的注解生效之后,前端传回的数据如果出现了错误时,返回给前端的却是这么一大串东西
![](https://img.haomeiwen.com/i20243133/40d37c21a9c13a4e.png)
而其中我们真正需要的数据只不过是出错数据的变量名和出错的原因,为了使返回的数据更加友好,这里进行了异常的拦截
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultVo MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
//创建了一个map,key为变量名称,value为错误信息
Map<String,String> map=new HashMap<>();
List<FieldError> list=e.getBindingResult().getFieldErrors();
for (FieldError error : list) {
//参数的名称和错误信息
map.put(error.getField(),error.getDefaultMessage());
}
//封装了更加友好的数据返回给前端
return ResultVo.fail(ErrorCode.PARAM_ERROR,map);
}
四.测试
此处使用Postman进行接口测试
![](https://img.haomeiwen.com/i20243133/def0523c43496052.png)
优雅!i了i了
2020.2.14
傍晚6:12