0
点赞
收藏
分享

微信扫一扫

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

yellowone 2022-04-14 阅读 137
javajpa

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类型数据

@PostMapping("/list")
    public Object addUser(@Valid @RequestBody SearchUser vo, BindingResult result)

这种方式要求前端传递的是json类型数据

举报

相关推荐

0 条评论