1:依赖引入 引入:

org.hibernate

hibernate-validator

或者引入:

org.springframework.boot

spring-boot-starter-validation

上面这两个依赖引入任意一个都行,当然了同是引入也是没问题的,但为了简化,我建议只引入一个。 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格式。

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: