Skip to content

8. 数据校验

校验的意义

前端校验框架比较多 参考()

https://www.runoob.com/jquery/jquery-plugin-validate.html

8.1. Spring整合Hibernate-validation校验

  • 引入hibernate-validator

  • 配置校验器

    • LocalValidatorFactoryBean
    • ReloadableResourceBundleMessageSource 加载的是 错误消息文件
      • ValidationErrorMess.properties : 统一设置IDEA 编辑Properties文件的编码 UTF-8
        • key=value status.max.error=status不能超过1
  • 使用 validator="validation" 让校验器生效

  • 使用

    • 在校验的Bean(User)

      • 在校验的属性 status 上面添加 校验规则 @NUll @NotNull @Min @Max.....
        • @Max(value=1 ,message="{status.max.error}")
    • 在Controller方法中接收 User对象的位置开启校验 添加@Validated注解@Validated User user

    • 接收错误消息 在校验对象的后面声明 BindingResult result result变量中包含了,所有的错误消息

8.1.1. pom.xml导入校验jar文件

配合Spring 的版本 5.2.4.RELEASE

xml
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.5.Final</version>
</dependency>

8.1.2. 配置校验器

让spring容器管理校验器

xml
<!--声明校验器-->
    <bean id="validation" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!--注入校验器的实现规则-->
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>

        <!--校验失败的错误消息 文件中读取-->
        <property name="validationMessageSource" ref="validationMessageSource"/>
    </bean>

<!--    使用此类ReloadableResourceBundleMessageSource加载属性文件-->
    <bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>classpath:ValidationErrorMess</value>
            </list>
        </property>
        <!--原始文件的编码-->
        <property name="defaultEncoding" value="utf-8"/>

        <!--读取文件的编码-->
        <property name="fileEncodings" value="utf-8"/>

        <!--设置最大缓存时间 2000毫秒之后重新加载配置文件-->
<!--    <property name="cacheMillis" value="2000"/> -->
        <property name="cacheSeconds" value="2"/>

    </bean>

8.1.3. 校验器注入到处理器适配器中

xml
<!--
    validator 属性的作用 将声明的校验器Bean注入到 处理器适配器 HandlerApapter
-->
<mvc:annotation-driven validator="validation" />

8.1.4编写错误消息文件

properties
status.max.error=状态不能大于1

image-20240320111201692

8.1.5 在User对象中添加校验规则

在需要校验的字段上添加校验规则注解,如@Size

控制器接受参数(需要校验的参数),例如接受用户User信息

  1. @Null 被注释的元素必须为 null
  2. @NotNull 被注释的元素必须不为 null
  3. @AssertTrue 被注释的元素必须为 true
  4. @AssertFalse 被注释的元素必须为 false
  5. @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  6. @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  7. @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  8. @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  9. @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
  10. @Digits(integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
  11. @Past 被注释的元素必须是一个过去的日期
  12. @Future 被注释的元素必须是一个将来的日期
  13. @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

java
package com.neuedu.mvc.entity;


import javax.validation.constraints.Max;
import java.util.Date;

/**
 * 用户的实体对象
 */
public class User {

    private Integer userId;
    private String userName;
    private String gender;
    private Date birthday;
    
    
    @Max(value = 2,message = "{status.max.error}")
    private Integer status;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId='" + userId + '\'' +
                ", userName='" + userName + '\'' +
                ", gender='" + gender + '\'' +
                ", birthday=" + birthday +
                ", status=" + status +
                '}';
    }
}

8.1.5 控制器的方法

在Controller方法中需要校验的Bean之前添加 @ Validated ,在校验的Bean之后 声明 BindingResult result 变量接收字段验证失败的消息

java
@RequestMapping(value = "update")
public String  update(@Validated User user  ,BindingResult result  ) throws ParseException {

    List<FieldError> fieldErrors = result.getFieldErrors();

    for (FieldError fieldError : fieldErrors) {
        String field = fieldError.getField();
        String defaultMessage = fieldError.getDefaultMessage();
        System.out.println("field = " + field);  // status
        System.out.println("defaultMessage = " + field); //状态不能大于1
    }


    //调用service保存
    boolean success = userService.updateById(user);
    String path = "";
    if(success) {
        path = "redirect:/user/list";
    }else{
        path = "/user/user_edit";
    }
    return path;
}

8.1.6. 捕获错误信息

java
List<FieldError> fieldErrors = result.getFieldErrors();

for (FieldError fieldError : fieldErrors) {
    String field = fieldError.getField();
    String defaultMessage = fieldError.getDefaultMessage();
    System.out.println("field = " + field);  // status
    System.out.println("defaultMessage = " + field); //状态不能大于1
}

8.1.7. 显示错误信息

java

Released under the MIT License.