广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java使用Validation进行数据校验
  • 806
分享到

java使用Validation进行数据校验

javaspring 2023-09-01 05:09:28 806人浏览 八月长安
摘要

在开发中,我们经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式,我们会把校验的代码和真正的业务处理逻辑耦合在一起,而且如果未来要新增一种校验逻辑也需

开发中,我们经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式,我们会把校验的代码和真正的业务处理逻辑耦合在一起,而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则,把校验和业务逻辑分离开,让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装,方便在Spring中使用。

在Spring中有多种校验的方式

第一种是通过实现org.springframework.validation.Validator接口,然后在代码中调用这个类

第二种是按照Bean Validation方式来进行校验,即通过注解的方式。

第三种是基于方法实现校验

除此之外,还可以实现自定义校验


场景一:通过Validator接口实现

引入相关依赖

            org.hibernate.validator        hibernate-validator        7.0.5.Final                org.glassfish        jakarta.el        4.0.1    

创建实体类,定义属性和方法

public class Person {    private String name;    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

创建类实现Validator接口,实现接口方法指定校验规则

public class PersonValidator implements Validator {    @Override    public boolean supports(Class clazz) {        return Person.class.equals(clazz);    }    @Override    public void validate(Object object, Errors errors) {        ValidationUtils.rejectIfEmpty(errors, "name", "name.empty");        Person p = (Person) object;        if (p.getAge() < 0) {            errors.rejectValue("age", "error value < 0");        } else if (p.getAge() > 110) {            errors.rejectValue("age", "error value too old");        }    }}

上面定义的类,其实就是实现接口中对应的方法,

supports方法用来表示此校验用在哪个类型上,

validate是设置校验逻辑的地点,其中ValidationUtils,是Spring封装的校验工具类,帮助快速实现校验。

使用上述Validator进行测试

 public static void main(String[] args) {        //创建person对象        Person person = new Person();        person.setName("lucy");        person.setAge(-1);                // 创建Person对应的DataBinder        DataBinder binder = new DataBinder(person);        // 设置校验        binder.setValidator(new PersonValidator());        // 由于Person对象中的属性为空,所以校验不通过        binder.validate();        //输出结果        BindingResult results = binder.getBindingResult();        System.out.println(results.getAllErrors());    }

场景二:Bean Validation注解实现

使用Bean Validation校验方式,就是如何将Bean Validation需要使用的javax.validation.ValidatorFactory 和javax.validation.Validator注入到容器中。spring默认有一个实现类LocalValidatorFactoryBean,它实现了上面Bean Validation中的接口,并且也实现了org.springframework.validation.Validator接口。

创建配置类,配置LocalValidatorFactoryBean

@Configuration@ComponentScan("com.cj.spring6.validator.three")public class ValidationConfig {        @Bean    public MethodValidationPostProcessor validationPostProcessor() {        return new MethodValidationPostProcessor();    }    }

创建实体类,使用注解定义校验规则

public class User {    @NotNull    private String name;    @Min(0)    @Max(120)    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

常用注解说明

@NotNull 限制必须不为null

@NotEmpty 只作用于字符串类型,字符串不为空,并且长度不为0

@NotBlank 只作用于字符串类型,字符串不为空,并且trim()后不为空串

@DecimalMax(value) 限制必须为一个不大于指定值的数字

@DecimalMin(value) 限制必须为一个不小于指定值的数字

@Max(value) 限制必须为一个不大于指定值的数字

@Min(value) 限制必须为一个不小于指定值的数字

@Pattern(value) 限制必须符合指定的正则表达式

@Size(max,min) 限制字符长度必须在min到max之间

@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

使用两种不同的校验器实现

使用jakarta.validation.Validator校验

@Servicepublic class MyService1 {    @Autowired    private Validator validator;    public  boolean validator(User user){        Set> sets =  validator.validate(user);        return sets.isEmpty();    }}

使用org.springframework.validation.Validator校验

@Servicepublic class MyService2 {    @Autowired    private Validator validator;    public boolean validaPersonByValidator(User user) {        BindException bindException = new BindException(user, user.getName());        validator.validate(user, bindException);        return bindException.hasErrors();    }}

最后进行测试
 

  @Test    public void testMyService1() {        ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);        MyService1 myService = context.getBean(MyService1.class);        User user = new User();        user.setAge(-1);        boolean validator = myService.validator(user);        System.out.println(validator);    }    @Test    public void testMyService2() {        ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);        MyService2 myService = context.getBean(MyService2.class);        User user = new User();        user.setName("lucy");        user.setAge(130);        user.setAge(-1);        boolean validator = myService.validaPersonByValidator(user);        System.out.println(validator);    }

场景三:基于方法实现校验

创建配置类,配置MethodValidationPostProcessor

@Configuration@ComponentScan("com.cj.spring6.validator.two")public class ValidationConfig {    @Bean    public LocalValidatorFactoryBean validatorFactoryBean() {        return new LocalValidatorFactoryBean();    }}

创建实体类,使用注解设置校验规则

import jakarta.validation.constraints.*;public class User {    @NotNull    private String name;    @Min(0)    @Max(120)    private int age;    @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码格式错误")    @NotBlank(message = "手机号码不能为空")    private String phone;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }}

定义Service类,通过注解操作对象

@Service@Validatedpublic class MyService {        public String testParams(@NotNull @Valid User user) {        return user.toString();    }}

最后测试

 @Test    public void testMyService1() {        ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);        MyService myService = context.getBean(MyService.class);        User user = new User();        user.setAge(-1);        myService.testParams(user);    }

来源地址:https://blog.csdn.net/weixin_46759354/article/details/129917617

--结束END--

本文标题: java使用Validation进行数据校验

本文链接: https://www.lsjlt.com/news/387542.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java使用Validation进行数据校验
    在开发中,我们经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式,我们会把校验的代码和真正的业务处理逻辑耦合在一起,而且如果未来要新增一种校验逻辑也需...
    99+
    2023-09-01
    java spring
  • 怎么在Spring boot中利用validation进行校验
    这篇文章主要为大家详细介绍了怎么在Spring boot中利用validation进行校验,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:前言接触springboot一年多,是时候摆脱这种校验方式了233 ,每...
    99+
    2023-06-06
  • SpringBoot使用validation做参数校验说明
    目录1.添加依赖直接添加 hibernate-validator添加spring-boot-starter-validation添加spring-boot-starter-...
    99+
    2022-11-13
  • SpringBoot怎么使用validation做参数校验
    这篇文章主要介绍了SpringBoot怎么使用validation做参数校验的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么使用validation做参数校验文章都会有所收获,下面我们一起...
    99+
    2023-06-30
  • SpringBoot使用validation做参数校验的实现步骤
    1.添加依赖 直接添加 hibernate-validator <dependency> <groupId>org.hibern...
    99+
    2022-11-12
  • SpringBoot 中使用 Validation 校验参数的方法详解
    目录1. Validation 介绍1.1 Validation 注解1.2 @valid 和 @validated的区别2. SpringBoot 中使用 Validator 校验...
    99+
    2022-11-13
  • 如何使用Bean Validation 解决业务中参数校验
    前言 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有点麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长...
    99+
    2022-11-12
  • 怎么使用Bean Validation解决业务中参数校验
    这篇文章将为大家详细讲解有关怎么使用Bean Validation解决业务中参数校验,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。叙述Bean Validation是一个通过配置注解来验证参数的框架,它包...
    99+
    2023-06-20
  • 使用SpringMVC怎么实现对数据进行校验
    使用SpringMVC怎么实现对数据进行校验?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、导入jar包若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个:c...
    99+
    2023-05-31
    springmvc
  • 如何进行C++代码的数据校验?
    如何进行C++代码的数据校验在编写C++代码时,数据校验是非常重要的一环。通过对用户输入的数据进行校验,可以增强程序的健壮性和安全性。本文将介绍一些常见的数据校验方法和技巧,帮助读者有效地进行C++代码的数据校验。输入数据类型检查在对用户输...
    99+
    2023-11-04
    跨平台 数据校验 C++代码
  • 使用@Valid+BindingResult进行controller参数校验方式
    目录@Valid+BindingResult进行controller参数校验Controller层方法的参数校验全局统一异常拦截器@Valid+BindingResult进行cont...
    99+
    2022-11-12
  • 使用Spring MVC怎么对参数进行校验
    本篇文章为大家展示了使用Spring MVC怎么对参数进行校验,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 内嵌异常处理如果只是这个controller的异常做单独处理,那么就适合绑定这个co...
    99+
    2023-05-31
    springmvc
  • 如何使用@Valid+BindingResult进行controller参数校验
    这篇文章主要介绍“如何使用@Valid+BindingResult进行controller参数校验”,在日常操作中,相信很多人在如何使用@Valid+BindingResult进行controller参数校验问题上存在疑惑,小编查阅了各式资...
    99+
    2023-06-21
  • 如何在SpringBoot中使用JSR303对后端数据进行校验
    如何在SpringBoot中使用JSR303对后端数据进行校验?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。项目创建首先创建一个springboot项目使用的s...
    99+
    2023-06-07
  • Node 中怎么在Controller 层进行数据校验
    Node 中怎么在Controller 层进行数据校验,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。数据校验层后端由于重业务逻辑以及待处理...
    99+
    2022-10-19
  • Springboot如何使用filter对requestbody参数进行校验
    目录使用filter对request body参数进行校验通过filter修改body参数的思路知识点步骤使用filter对request body参数进行校验 @Slf4j pub...
    99+
    2022-11-13
  • 使用SpringSecurity 进行自定义Token校验
    背景 Spring Security默认使用「用户名/密码」的方式进行登陆校验,并通过cookie的方式存留登陆信息。在一些定制化场景,比如希望单独使用token串进行部分页面的访问...
    99+
    2022-11-12
  • Java怎么使用责任链默认优雅地进行参数校验
    本篇内容介绍了“Java怎么使用责任链默认优雅地进行参数校验”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言项目中参数校验十分重要,它可以...
    99+
    2023-07-05
  • Python如何进行数据指纹MD5校验对比
    Python如何进行数据指纹MD5校验对比,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python3—数据指纹MD5校验与对比MD5消息摘要算法(英语:MD5...
    99+
    2023-06-02
  • Springboot怎么使用filter对request body参数进行校验
    这篇文章主要为大家展示了“Springboot怎么使用filter对request body参数进行校验”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Springboot怎么使用fil...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作