SpringBoot使用 ValidationApi 进行参数校验
在开发接口时,经常遇到参数校验,之前的做法,都是把每个参数拿出来进行判空操作,接口一旦多起来,冗余代码非常多。
可以通过ValidationApi来解决这个问题
添加依赖包
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
若项目是springboot版本是2.0以上的项目,就不需要添加该依赖,web组件内置了这个依赖。
只需要在对象上加上注解
@Data
public class User implements Serializable {
private Integer id;
@NotBlank(message = "用户名不能为空")
private String name;
// @Phone 自定义的注解,发现不能匹配正则表达式
@Pattern(regexp = "1[3|4|5|7|8][0-9]\\d{8}", message = "手机号格式错误")
private String phone;
@Email(message = "邮箱格式不正确")
@NotBlank(message = "邮箱不能为空")
private String email;
@Valid
@NotNull(message = "父母姓名不可为空")
private ParentName parentName;
}
对象中嵌套对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ParentName implements Serializable {
@NotBlank(message = "父亲名不能为空")
private String fatherName;
@NotBlank(message = "母亲名不能为空")
private String motherName;
}
在controller层接收参数时,加上@Valid注解,指定这个参数(对象)需要进行校验
@RequestMapping(value = "/addUser", method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String addUser(@RequestBody @Valid User user) {
return "success";
}
如果只进行校验不处理,调用方会接收到一个400的报错,也可以自定义处理
@RequestMapping(value = "/addUser", method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String addUser(@RequestBody @Valid User user,
BindingResult results) {
if (results.hasErrors()) {
return "请求参数异常,错误信息为:" + results.getFieldError().getDefaultMessage();
}
return "success";
}
测试展示返回结果
但不是前端所需要的,需要进行封装
@RequestMapping(value = "/addUser", method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResultModel addUser(@RequestBody @Valid User user,
BindingResult results) {
ResultModel resultModel = new ResultModel();
if (results.hasErrors()) {
resultModel.setDesc(results.getFieldError().getDefaultMessage());
resultModel.setCode("400");
return resultModel;
}
System.out.println(user);
resultModel.setDesc(ResponseCode.SUCCESS.getDesc());
resultModel.setCode(String.valueOf(ResponseCode.SUCCESS.getCode()));
return resultModel;
}
验证结果: