1:依赖引入
引入:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
或者引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
上面这两个依赖引入任意一个都行,当然了同是引入也是没问题的,但为了简化,我建议只引入一个。
2:实际使用:
Controller层:
@RestController
@RequestMapping("/v1/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping("/list")
public Object addUser(@Valid SearchUser vo, BindingResult result){
if(result.hasErrors()){
//这里我写的是自定义的异常处理类,你也可以做别的处理
throw new LogicException(BaseRespCode.WARN_PARAM, result.getFieldError().getDefaultMessage());
}
return vo;
}
}
SearchUser 实体类:
@Data
@ApiModel
public class SearchUser {
@ApiModelProperty(value = "id", name = "id", dataType = "Long")
private Long id;
@ApiModelProperty(value = "userName", name = "userName", dataType = "String")
private String userName;
@ApiModelProperty(value = "nickName", name = "nickName", dataType = "String")
private String nickName;
@ApiModelProperty(value = "sex", name = "sex", dataType = "String")
private String sex;
@ApiModelProperty(value = "age", name = "age", dataType = "Integer")
private Integer age;
@ApiModelProperty(value = "page", name = "page", dataType = "Integer")
@NotNull(message = "page不能为空")
private Integer page;
@ApiModelProperty(value = "size", name = "size", dataType = "Integer")
@NotNull(message = "size不能为空")
private Integer size;
}
我遇到的问题:
1:无法捕获参数检验信息,
原因:没引入依赖
result.hasErrors() //一直是true
2:result.getFieldError().getDefaultMessage()的使用,该方法会随机捕获一条参数异常的默认提示消息,而不是按照我们实体类写的属性参数顺序进行捕获。
@NotNull
private Integer size;
这种捕获的结果就是:不能为null,如果实体类里存在多个属性都是该注解声明的,那就无法准确锁定哪个参数没传值过来,所以我建议用下面这种写法:
@NotNull(message = "size不能为空")
private Integer size;
这样写的话,捕获的信息就是:size不能为空,即可准确锁定size参数没传值。
3:传参数的注意点
@PostMapping("/list")
public Object addUser(@Valid SearchUser vo, BindingResult result)
这种方式要求前端传递的是form-data类型数据,那如果前端非要传json数据,会如何呢?
从图片中可以看到,我确实传了page 参数,但后端接收不到。
@PostMapping("/list")
public Object addUser(@Valid @RequestBody SearchUser vo, BindingResult result)
这种方式要求前端传递的是json类型数据,那如果传递的是form-data类型的参数会如何呢?
我自定义的全局异常捕获到了,提示系统异常,从报错可以看到,不支持form-data格式。
总结:如果后端接口参数是一个实体类,而没加@RequestBody,无论前端传递的数据是form-data还是json,都没问题,因为后端接收前端传递的form-data参数后,后端底层框架会自动把它转换成json;如果传递过来的就是json,那就直接用,不用在转。
但是,如果加了@RequestBody,就声明了只接受json数据参数,否则就会底层框架报错,不支持for-data格式。