好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

@Valid 校验无效,BindingResult未获得错误的解决

@ Valid 校验 失效

问题描述

使用@Valid校验实体类中的属性stuTele

?

1

2

3

4

import javax.validation.constraints.Size;

...

@Size (min = 11 ,max = 11 ,message = "请输入11位手机号码" )

private String stuTele;

Controller中,用@Valid注解对传入的student对象属性值校验

?

1

public String updateStuMsg( @Valid   Student student, BindingResult bindingResult, Model model, HttpSession httpSession){......}

在传入错误参数后,发现bindingResult中记录的error为0,说明校验无效

解决过程

检查引入的依赖:

?

1

2

3

4

5

6

7

8

9

10

< dependency >

     < groupId >org.hibernate</ groupId >

     < artifactId >hibernate-validator</ artifactId >

     < version >7.0.1.Final</ version >

</ dependency >

< dependency >

     < groupId >javax.validation</ groupId >

     < artifactId >validation-api</ artifactId >

     < version >2.0.1.Final</ version >

</ dependency >

在将hibernate-validator的版本切换到 5.4.1.Final 后,发现校验正常

所以定位为依赖的版本问题。

我的springboot版本为2.5.1,在将依赖替换为下面的内容后,校验生效

?

1

2

3

4

5

<!-- 此处没有指定版本<version>,默认会使用和当前springboot匹配的版本也就是2.5.1 -->

< dependency >

     < groupId >org.springframework.boot</ groupId >

     < artifactId >spring-boot-starter-validation</ artifactId >

</ dependency >

进入spring-boot-starter-validation 里面,查看它的依赖项,其中有这样一条

?

1

2

3

4

5

6

< dependency >

     < groupId >org.hibernate.validator</ groupId >

     < artifactId >hibernate-validator</ artifactId >

     < version >6.2.0.Final</ version >

     < scope >compile</ scope >

</ dependency >

所以在外部修改依赖的时候,也可以直接使用这一版本。

validation-api 这条依赖可以不用保留。

那么最新的7.0.1.Final版本该如何使用? 官方文档 里是这样说的

Jakarta Bean Validation 定义了与 CDI( Jakarta EE 的上下文和依赖注入 )的集成点。如果您的应用程序在不提供这种开箱即用集成的环境中运行,您可以通过将以下 Maven 依赖项添加到您的 POM 来使用 Hibernate Validator CDI 可移植扩展:

示例 1.3:Hibernate Validator CDI 可移植扩展 Maven 依赖项

?

1

2

3

4

5

< dependency >

     < groupId >org.hibernate.validator</ groupId >

     < artifactId >hibernate-validator-cdi</ artifactId >

     < version >7.0.1.Final</ version >

</ dependency >

请注意,在 Java EE 应用程序服务器上运行的应用程序通常不需要添加此依赖项。

那么,只需要把前面的依赖都替换成这一条,就可以了

?

1

2

3

4

5

< dependency >

     < groupId >org.hibernate.validator</ groupId >

     < artifactId >hibernate-validator-cdi</ artifactId >

     < version >7.0.1.Final</ version >

</ dependency >

使用bindingResult做参数校验

在控制类中

?

1

2

3

4

5

6

7

8

@RequestMapping ( "/create" )

    public void create( @Valid OrderForm orderForm, BindingResult bindingResult){

        if (bindingResult.hasErrors()){

            log.error( "【创建订单参数不正确】,orderForm={}" ,orderForm);

            //bindingResult.getFieldError().getDefaultMessage()可以获取到错误的提示

            throw new OrderException(ResultEnums.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage());

        }

    }

实体类OrderForm

?

1

2

3

4

5

6

7

8

9

10

11

12

13

@Data

public class OrderForm {

     @NotEmpty (message = "姓名必填" )

     private String name; //买家姓名

     @NotEmpty (message = "手机号必填" )

     private String phone; //买家手机号

     @NotEmpty (message = "地址必填" )

     private String address; //买家地址

     @NotEmpty (message = "openid必填" )

     private String openid; //买家微信

     @NotEmpty (message = "购物车不能为空" )

     private String items; //购物车

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/Lao_gan_ma/article/details/119175862

查看更多关于@Valid 校验无效,BindingResult未获得错误的解决的详细内容...

  阅读:20次