【Java 高阶】一文精通 Spring MVC - 数据验证(七)

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区

💞 个人主页:个人主页

🙉 专栏地址: ✅ Java 高阶

🙉八股文专题:剑指大厂,手撕 Java 八股文

文章目录

      • [1. 什么是数据验证](#1. 什么是数据验证)
      • [2. 数据验证的应用场景](#2. 数据验证的应用场景)
      • [3. SpringMVC @Validator 使用方法](#3. SpringMVC @Validator 使用方法)
      • [4. SpringMVC 自定义数据验证案例](#4. SpringMVC 自定义数据验证案例)

1. 什么是数据验证

SpringMVC 数据验证是指在 SpringMVC 框架中对用户提交的数据进行验证,确保数据的合法性和有效性。通过数据验证,可以防止无效或恶意的数据进入系统,提高系统的安全性和稳定性。以下是 SpringMVC 数据验证的相关内容:

  1. 注解驱动验证:SpringMVC 提供了一系列的注解,如 @NotNull、@NotEmpty、@Min、@Max 等,用于对请求参数进行验证。可以将这些注解应用到控制器方法的参数上,或者在实体类的属性上进行验证。

示例:

java 复制代码
@RequestMapping("/example")
public String example(@NotNull @Min(18) Integer age, @NotEmpty String name) {
    // 验证年龄不为空且大于等于18,姓名不为空
    // 处理业务逻辑
    return "example";
}
  1. 自定义验证器:除了使用注解进行验证外,还可以创建自定义的验证器来实现更复杂的验证逻辑。自定义验证器需要实现 Spring 的 Validator 接口,并在控制器方法或配置文件中进行注册。

通过以上方式,SpringMVC 可以方便地进行数据验证,确保数据的合法性和有效性。这有助于提高系统的安全性和可靠性。

2. 数据验证的应用场景

数据验证的应用场景广泛,适用于各种需要确保数据合法性和有效性的场景。以下是一些常见的数据验证应用场景:

  1. 表单验证:在用户提交表单数据时,验证输入的数据是否符合要求。例如,验证必填字段是否为空、验证邮箱格式是否正确、验证密码是否符合规定的复杂度等。

  2. 数据库操作:在进行数据库操作之前,对数据进行验证,以确保数据的完整性和一致性。例如,验证外键关联是否存在、验证唯一约束是否满足等。

  3. API 接口验证:在接收到外部请求时,对请求参数进行验证,以确保请求的合法性和安全性。例如,验证请求参数的类型和范围、验证请求头信息是否正确等。

  4. 身份验证:在用户登录或访问敏感信息时,对用户身份进行验证,以确保用户的合法性和权限。例如,验证用户名和密码是否匹配、验证访问令牌是否有效等。

  5. 数据转换和格式化:在将数据从一种格式转换为另一种格式时,进行数据验证,以确保转换的准确性和有效性。例如,将字符串转换为日期对象时,验证字符串是否符合日期格式。

  6. 业务规则验证:根据业务需求,对数据进行特定的验证。例如,验证订单金额是否超过用户账户余额、验证商品库存是否足够等。

数据验证在应用开发中扮演着重要的角色,可以保证数据的质量和一致性,提高系统的稳定性和安全性。

3. SpringMVC @Validator 使用方法

SpringMVC 中的 @Validator 注解用于对数据进行验证,确保数据的合法性和有效性。以下是 @Validator 的使用案例:

  1. 创建验证器类:
java 复制代码
@Component
public class MyValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return MyObject.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "name.empty", "姓名不能为空");
        // 其他验证规则
    }
}

在上述示例中,我们创建了一个名为 MyValidator 的验证器类,实现了 Validator 接口,并重写了 supports() 和 validate() 方法。supports() 方法用于指定该验证器支持的验证对象类型,validate() 方法用于实现具体的验证逻辑。

  1. 在控制器中使用 @Validator 注解:
java 复制代码
@Controller
public class MyController {

    @Autowired
    private MyValidator validator;

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(validator);
    }

    @RequestMapping("/example")
    public String example(@Validated MyObject myObject, BindingResult result) {
        if (result.hasErrors()) {
            // 处理验证错误
            return "error";
        }
        // 处理业务逻辑
        return "example";
    }
}

在上述示例中,我们在控制器类中使用了 @Validator 注解,并在 initBinder() 方法中将自定义的验证器 MyValidator 添加到 WebDataBinder 中。然后,在处理请求的方法中使用 @Validated 注解标记需要验证的对象,并使用 BindingResult 参数接收验证结果。

通过这样的配置和使用,SpringMVC 会自动调用验证器对请求参数进行验证,验证结果会存储在 BindingResult 对象中。我们可以根据验证结果进行相应的处理,例如返回错误页面或处理业务逻辑。

4. SpringMVC 自定义数据验证案例

SpringMVC 中的数据验证可以通过自定义验证注解和验证器来实现。以下是一个自定义数据验证的案例:

  1. 创建自定义验证注解:
java 复制代码
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomValidator.class)
public @interface MyCustomValidation {
    String message() default "自定义验证失败";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

在上述示例中,我们创建了一个名为 MyCustomValidation 的自定义验证注解。通过 @Constraint 注解指定了该注解的验证器类为 MyCustomValidator,并定义了一些默认的属性。

  1. 创建自定义验证器:
java 复制代码
public class MyCustomValidator implements ConstraintValidator<MyCustomValidation, String> {

    @Override
    public void initialize(MyCustomValidation constraintAnnotation) {
        // 初始化验证器
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 自定义验证逻辑,返回 true 表示验证通过,返回 false 表示验证失败
        return value != null && value.startsWith("ABC");
    }
}

在上述示例中,我们创建了一个名为 MyCustomValidator 的自定义验证器类,实现了 ConstraintValidator 接口,并指定了该验证器对应的注解类型为 MyCustomValidation。在 isValid() 方法中实现了自定义的验证逻辑,判断字符串是否以 "ABC" 开头。

  1. 在实体类中使用自定义验证注解:
java 复制代码
@Data
public class MyEntity {
    
    @MyCustomValidation
    private String myField;
 
}

在上述示例中,我们在实体类 MyEntity 的字段 myField 上使用了自定义的验证注解 @MyCustomValidation。

  1. 在控制器中进行数据验证:
java 复制代码
@Controller
public class MyController {

    @RequestMapping("/example")
    public String example(@Valid MyEntity myEntity, BindingResult result) {
        if (result.hasErrors()) {
            // 处理验证错误
            return "error";
        }
        // 处理业务逻辑
        return "example";
    }
}

在上述示例中,我们在处理请求的方法中使用了 @Valid 注解来触发数据验证,并使用 BindingResult 参数接收验证结果。如果验证结果中存在错误,我们可以根据需要进行相应的处理。

通过自定义验证注解和验证器,我们可以实现更加灵活和复杂的数据验证逻辑,以满足具体的业务需求。

精彩专栏推荐订阅:在下方专栏👇🏻
2023年华为OD机试真题(A卷&B卷)+ 面试指导
精选100套 Java 项目案例
面试需要避开的坑(活动)
你找不到的核心代码
带你手撕 Spring
Java 初阶

相关推荐
渣哥15 小时前
原来 Java 里线程安全集合有这么多种
java
间彧15 小时前
Spring Boot集成Spring Security完整指南
java
间彧16 小时前
Spring Secutiy基本原理及工作流程
java
Java水解17 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆19 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学19 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole19 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊20 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端
程序员鱼皮20 小时前
刚刚 Java 25 炸裂发布!让 Java 再次伟大
java·javascript·计算机·程序员·编程·开发·代码