当前位置:首页 > 科技  > 软件

API接口参数验证的必备神器,让你的代码更高效!

来源: 责编: 时间:2023-11-07 09:13:52 373观看
导读环境:Springboot2.6.121. 简介Spring Validation是一种轻量级的数据验证框架,主要用于对Java对象进行校验。它为数据验证提供了统一的接口和基本的校验功能,解决了数据校验这一常见问题,让开发人员能够方便地对数据进行验

环境:Springboot2.6.12Upo28资讯网——每日最新资讯28at.com

1. 简介

Spring Validation是一种轻量级的数据验证框架,主要用于对Java对象进行校验。它为数据验证提供了统一的接口和基本的校验功能,解决了数据校验这一常见问题,让开发人员能够方便地对数据进行验证,从而保证数据的有效性和安全性。Upo28资讯网——每日最新资讯28at.com

Spring Validation提供了一套注解,用于对Java对象进行校验,支持嵌套校验和分组校验,支持国际化和自定义注解和校验器,可以满足各种复杂的校验需求。它的主要特点包括:Upo28资讯网——每日最新资讯28at.com

  1. 轻量级:Spring Validation只做验证相关的事情,不包含复杂的业务逻辑。
  2. 简单易用:基于注解,简洁明了,易于维护。
  3. 校验规则灵活:支持自定义校验规则,可扩展性强。
  4. 支持国际化:根据不同的语言环境,使用不同的校验提示消息。
  5. 集成Hibernate Validator:Spring Validation默认使用Hibernate Validator作为其具体的实现,可以轻松地与其他数据验证框架一起工作。

Upo28资讯网——每日最新资讯28at.com

Bean Validation 为Java应用程序提供了一种通过约束声明和元数据进行验证的通用方法。要使用它,只需要对POJO属性进行注释,然后由运行时强制执行这些约束。有内置的约束,你也可以定义自己的自定义约束。如下所示:Upo28资讯网——每日最新资讯28at.com

public class Person {  @NotNull  @Size(max=64)  private String name;  @Min(0)  private int age;}

Bean验证验证器然后根据声明的约束验证此类的实例。有关API的一般信息,请参见Bean验证。有关特定约束,请参阅Hibernate验证程序文档。Upo28资讯网——每日最新资讯28at.com

配置Bean验证提供程序

Spring提供了对Bean验证API的全面支持,包括将Bean验证提供者作为Spring Bean。这使你可以在应用程序中需要验证的任何位置注入javax.validation.ValidatorFactory或javax.validation.Validator。Upo28资讯网——每日最新资讯28at.com

你可以使用LocalValidatorFactoryBean将默认验证器配置为Spring Bean,如下例所示:Upo28资讯网——每日最新资讯28at.com

import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;@Configurationpublic class AppConfig {  @Bean  public LocalValidatorFactoryBean validator() {    return new LocalValidatorFactoryBean();  }}

上面的示例中的基本配置使用默认引导机制触发bean验证进行初始化。Bean验证提供程序(如Hibernate验证程序)应该出现在类路径中,并被自动检测到。Upo28资讯网——每日最新资讯28at.com

Upo28资讯网——每日最新资讯28at.com

2. 注入 Validator

Upo28资讯网——每日最新资讯28at.com

@Servicepublic class PersonService {  // inject javaee validator object  @Resource  private Validator validator ;  // inject spring validator object  @Resource  private org.springframework.validation.Validator valid ;}

简单实例

接着上面的配置,我们只需要做验证动作即可。Upo28资讯网——每日最新资讯28at.com

@Servicepublic class PersonService {  @Resource  private Validator validator ;  @Resource  private org.springframework.validation.Validator valid ;  public void validator(Person person) {    Set<ConstraintViolation<Person>> res = validator.validate(person) ;    res.forEach(cv -> {      System.out.println(cv.getMessage()) ;    });    System.out.println("----------------------") ;    BindingResult errors = new MapBindingResult(new HashMap<String, Object>(), "person") ;    valid.validate(person, errors) ;    if (errors.hasErrors()) {      errors.getAllErrors().forEach(oe -> {        System.out.println(oe.getDefaultMessage()) ;      });    }  }}

测试

@SpringBootTestclass SpringBootValidationApplicationTests {  @Resource  private PersonService ps ;  @Test  public void testValidator() {    Person person = new Person() ;    person.setAge(-1);    ps.validator(person) ;  }}
最小不能小于0不能为null----------------------最小不能小于0不能为null

3. 自定义注解验证

每个Bean验证约束由两部分组成:Upo28资讯网——每日最新资讯28at.com

  • 声明约束及其可配置属性的@Constraint注释。
  • 实现约束行为的javax.validation.ConstraintValidator接口的实现。

要将声明与实现关联,每个@Constraint注释都会引用相应的ConstraintValidator实现类。在运行时,当域模型中遇到约束注释时,ConstraintValidatorFactory将实例化引用的实现。下面的示例实现一个前缀匹配的验证逻辑:Upo28资讯网——每日最新资讯28at.com

Upo28资讯网——每日最新资讯28at.com

自定义注解Upo28资讯网——每日最新资讯28at.com

@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = PrefixConstraintValidator.class)public @interface PrefixConstraint {  String value() default "" ;  // 这里的{validator.prefix.error}就是资源文件中定义的错误信息  String message() default "{validator.prefix.error}";  Class<?>[] groups() default { };  Class<? extends Payload>[] payload() default { };}

以上的注解属性都是必须的。Upo28资讯网——每日最新资讯28at.com

注意message属性是我们将发生错误后错误信息定义在配置文件中,而该文件的basename必须是ValidationMessages,如果你需要国际化支持,那么就这样命名:ValidationMessages_zh_CN.properties。Upo28资讯网——每日最新资讯28at.com

Upo28资讯网——每日最新资讯28at.com

自定义验证器

public class PrefixConstraintValidator implements ConstraintValidator<PrefixConstraint, CharSequence> {  @Resource  private DataService ds ;  private String prefix ;  @Override  public boolean isValid(CharSequence value, ConstraintValidatorContext context) {    ds.ak() ;    if ( value == null ) {      return false ;    }    return ((String) value).startsWith(prefix) ;  }  @Override  public void initialize(PrefixConstraint pc) {    prefix = pc.value() ;  }}

验证器必须实现ConstraintValidator接口,该接口是泛型接口,第一个参数是该验证器要用于在那个注解,第二个参数是该注解应用在什么数据类型上。注意:在自定义验证器中我们是可以随意地注入其它Bean对象,是不是很强大?Upo28资讯网——每日最新资讯28at.com

基于方法级的验证

你可以通过MethodValidationPostProcessor Bean定义将Bean validation 1.1(以及Hibernate Validator 4.3的自定义扩展)支持的方法验证功能集成到Spring上下文中:Upo28资讯网——每日最新资讯28at.com

@Beanpublic MethodValidationPostProcessor validationPostProcessor() {  return new MethodValidationPostProcessor();}@Service@Validatedpublic class PersonService {  @NotNull(message = "返回值不能为空")  public Person findPerson(@NotEmpty(message = "ID 不能为空") String id) {    return null ;  }}

注意:类上必须有@Validated注解;因为上面的BeanPostProcessor中定义的Advisor(DefaultPointcutAdvisor)使用的切入的Pointcut在类级别上过滤条件是必须有@Validated注解,而方法则是拦截所有的方法。Upo28资讯网——每日最新资讯28at.com

Upo28资讯网——每日最新资讯28at.com

测试

图片Upo28资讯网——每日最新资讯28at.com

这里是抛出的异常javax.validation.ConstraintViolationException,所有我们需要一个全局的异常拦截器来对异常做处理。Upo28资讯网——每日最新资讯28at.com

其他配置选项

默认的LocalValidatoryFactoryBean配置对于大多数情况都足够了。对于各种Bean验证构造,有许多配置选项,从消息插值到遍历解析。有关这些选项的更多信息,请参阅LocalValidatorFactoryBean Javadoc。Upo28资讯网——每日最新资讯28at.com

https://docs.spring.io/spring-framework/docs/5.3.11/javadoc-api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.htmlUpo28资讯网——每日最新资讯28at.com

Upo28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17391-0.htmlAPI接口参数验证的必备神器,让你的代码更高效!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 了不起的Base64

下一篇: 使用漏桶算法实现一秒钟50个限流

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 一加首款折叠屏!一加Open渲染图出炉:罕见单手可握小尺寸

    8月5日消息,此前就有爆料称,一加首款折叠屏手机将会在第三季度上市,如今随着时间临近,新机的各种消息也开始浮出水面。据悉,这款新机将会被命名为&ldquo;On
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
Top