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

欧易OKX

欧易OKX

               

欧易OKx是全球三大比特币交易所之一,注册即开最高6万元盲盒,100%中奖!

           官网注册
类上必须有@Validated注解;因为上面的BeanPostProcessor中定义的Advisor(DefaultPointcutAdvisor)使用的切入的Pointcut在类级别上过滤条件是必须有@Validated注解,而方法则是拦截所有的方法。

环境:Springboot2.6.12

1. 简介

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

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

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

 

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

public class Person {


  @NotNull
  @Size(max=64)
  private String name;
  @Min(0)
  private int age;


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

Bean验证验证器然后根据声明的约束验证此类的实例。有关API的一般信息,请参见Bean验证。有关特定约束,请参阅Hibernate验证程序文档。

配置Bean验证提供程序

Spring提供了对Bean验证API的全面支持,包括将Bean验证提供者作为Spring Bean。这使你可以在应用程序中需要验证的任何位置注入javax.validation.ValidatorFactory或javax.validation.Validator。

你可以使用LocalValidatorFactoryBean将默认验证器配置为Spring Bean,如下例所示:

import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;


@Configuration
public class AppConfig {


  @Bean
  public LocalValidatorFactoryBean validator() {
    return new LocalValidatorFactoryBean();
  }


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

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

 

2. 注入 Validator

 

@Service
public class PersonService {
  // inject javaee validator object
  @Resource
  private Validator validator ;
  // inject spring validator object
  @Resource
  private org.springframework.validation.Validator valid ;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

简单实例

接着上面的配置,我们只需要做验证动作即可。

@Service
public 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()) ;
      });
    }
  }


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

测试

@SpringBootTest
class SpringBootValidationApplicationTests {


  @Resource
  private PersonService ps ;


  @Test
  public void testValidator() {
    Person person = new Person() ;
    person.setAge(-1);
    ps.validator(person) ;
  }


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

最小不能小于0
不能为null
----------------------
最小不能小于0
不能为null
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

3. 自定义注解验证

每个Bean验证约束由两部分组成:

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

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

 

自定义注解

@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 { };


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

以上的注解属性都是必须的。

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

 

自定义验证器

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() ;
  }


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

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

基于方法级的验证

你可以通过MethodValidationPostProcessor Bean定义将Bean validation 1.1(以及Hibernate Validator 4.3的自定义扩展)支持的方法验证功能集成到Spring上下文中:

@Bean
public MethodValidationPostProcessor validationPostProcessor() {
  return new MethodValidationPostProcessor();
}
@Service
@Validated
public class PersonService {


  @NotNull(message = "返回值不能为空")
  public Person findPerson(@NotEmpty(message = "ID 不能为空") String id) {
    return null ;
  }


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

注意:类上必须有@Validated注解;因为上面的BeanPostProcessor中定义的Advisor(DefaultPointcutAdvisor)使用的切入的Pointcut在类级别上过滤条件是必须有@Validated注解,而方法则是拦截所有的方法。

 

测试

图片

这里是抛出的异常javax.validation.ConstraintViolationException,所有我们需要一个全局的异常拦截器来对异常做处理。

其他配置选项

默认的LocalValidatoryFactoryBean配置对于大多数情况都足够了。对于各种Bean验证构造,有许多配置选项,从消息插值到遍历解析。有关这些选项的更多信息,请参阅LocalValidatorFactoryBean Javadoc。

风险提示:根据央行等部门发布“关于进一步防范和处置虚拟货币交易炒作风险的通知”,本网站内容仅用于信息分享,不对任何经营与投资行为进行推广与背书,请读者严格遵守所在地区法律法规,不参与任何非法金融行为。本文收集整理自网络,不代表经典网立场,如若转载,请注明出处:https://www.jingdian230.com/baike/135076.html

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台用户上传并发布,本平台仅提供信息存储服务。

Special statement: The above contents (including pictures or videos, if any) are uploaded and released by users of the we-media platform. This platform only provides information storage services.

(0)
欧易OKX

欧易OKX

               

欧易OKx是全球三大比特币交易所之一,注册即开最高6万元盲盒,100%中奖!

           官网注册

相关推荐

  • 张扬跋扈是什么意思(张扬跋扈的意思)

    很多人对张扬跋扈是什么意思(张扬跋扈的意思)这个问题比较感兴趣,这里,金色百科小编大浪就给大家详细解答一下。 张扬跋扈意思原指举止放荡高傲,现用来形容放纵骄横,目中无人,意为霸道、…

    金色百科 2023年 5月 10日
    155
  • 合单之数放心中,水远山遥难信实是什么生肖,精选答案落实

    合单之数放心中,水远山遥难信实指的是生肖猪、指的是生肖蛇、指的是生肖猴。 合单之数放心中,水远山遥难信实在十二生肖代表生肖猪、蛇、猴、羊、兔、猪。 生肖猪 生肖猪的人破冰和好,紫气…

    金色百科 2024年 3月 21日
    46
  • 10月21日是什么星座

    10月21日是什么星座?阳历10月21号是什么星座?刚接触星座的用户不知道星座是按阴历还是阳历计算,星座是占星学的一部分起源于西方,星座日期是按阳历计算查询的。10月21日出生的人…

    金色百科 2024年 1月 17日
    113
  • 8月1日是什么星座

    8月1日是什么星座?阳历8月1号是什么星座?刚接触星座的用户不知道星座是按阴历还是阳历计算,星座是占星学的一部分起源于西方,星座日期是按阳历计算查询的。8月1日出生的人是狮子座,和…

    金色百科 2024年 4月 25日
    15
  • 24vdc是什么意思(12vdc是什么意思)

    很多人对24vdc是什么意思(12vdc是什么意思)这个问题比较感兴趣,这里,金色百科小编大浪就给大家详细解答一下。 24VDC接触器表示初级线圈工作电压为24V的直流接触器;在电…

    金色百科 2023年 5月 28日
    123
  • 土象星座喜欢的女人性格

    土象星座喜欢的女人性格,土象星座喜欢的女人性格是什么,土象星座的成员有摩羯座、处女座还有金牛座,这些星座都有共同的特性,就是比较务实且保守,那么土象星座喜欢的女人性格是什么? 土象…

    2024年 3月 28日
    36
  • 吵闹的街道需要一个相伴,附近寻伴速配让你找到一个合适的伴侣。

    作为人类社会的一部分,我们总是需要社交和交往。在我们的生活中,有些时候我们会孤独、无聊或者不开心,这时候,有一个可以与我们相伴的人会让我们感到温暖和舒适。比如说,当我们走在一个吵闹…

    2023年 11月 5日
    126
  • 欧易OKX

    欧易OKX

                   

    欧易OKx是全球三大比特币交易所之一,注册即开最高6万元盲盒,100%中奖!

               官网注册
  • 西湖醋鱼是哪里的菜

    一.西湖醋鱼是哪里的菜 西湖醋鱼,别名为叔嫂传珍,宋嫂鱼,是浙江省杭州市的一道传统地方风味名菜,属于浙菜系。 西湖醋鱼的做法: 1、葱切段,姜切片。鱼清洗干净后破开,切花刀备用。 …

    金色百科 6天前
    26
  • 爱你这件事情不会随着时间而打对折是什么歌

    网络上经常会有很多好听的歌曲出现并且走红,最近一段时间不少人在问爱你这件事情不会随着时间而打对折是什么歌?谁唱的?歌词完整版是什么?下面小编为大家带来爱你这件事情不会随着时间而打对…

    金色百科 2024年 1月 15日
    108
  • 平安i贷逾期多久会起诉

    (一)平安i贷逾期多久会起诉 平安普惠旗下有一个非常热销的信用贷款产品名叫平安i贷,与平安银行不同,平安普惠是专门做消费贷款的公司,隶属平安集团。平安普惠虽然不是银行,但是属于金融…

    金色百科 2024年 3月 21日
    25