关于@Valid使用过程中踩到的坑

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格式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值