成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

API接口參數驗證的必備神器,讓你的代碼更高效!

開發 前端
類上必須有@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;


}

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


}

上面的示例中的基本配置使用默認引導機制觸發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 ;
}

簡單實例

接著上面的配置,我們只需要做驗證動作即可。

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


}

測試

@SpringBootTest
class 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驗證約束由兩部分組成:

  • 聲明約束及其可配置屬性的@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 { };


}

以上的注解屬性都是必須的。

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


}

驗證器必須實現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 ;
  }


}

注意:類上必須有@Validated注解;因為上面的BeanPostProcessor中定義的Advisor(DefaultPointcutAdvisor)使用的切入的Pointcut在類級別上過濾條件是必須有@Validated注解,而方法則是攔截所有的方法。

測試

圖片

這里是拋出的異常javax.validation.ConstraintViolationException,所有我們需要一個全局的異常攔截器來對異常做處理。

其他配置選項

默認的LocalValidatoryFactoryBean配置對于大多數情況都足夠了。對于各種Bean驗證構造,有許多配置選項,從消息插值到遍歷解析。有關這些選項的更多信息,請參閱LocalValidatorFactoryBean Javadoc。

https://docs.spring.io/spring-framework/docs/5.3.11/javadoc-api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.html

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2010-12-23 15:55:00

上網行為管理

2024-08-19 00:35:00

Pythondict遍歷列表推導式

2023-07-26 07:41:53

Python線程狀態

2024-02-26 16:40:58

2025-04-24 08:40:00

JavaScript代碼return語句

2011-08-29 09:33:48

2023-07-28 07:31:56

FFmpeg開源

2019-04-29 08:31:25

PythonPandas數據

2015-07-03 10:46:26

PHP程序員工作高效

2019-11-25 10:20:54

CSS代碼javascript

2018-05-08 14:58:07

戴爾

2019-01-29 05:34:47

GitHub插件代碼

2018-09-16 22:46:18

Mock單元測試集成測試

2024-12-03 00:44:50

2024-12-10 08:00:00

C++CRTP函數

2025-05-29 08:35:39

Python代碼開發

2024-08-02 17:23:12

2023-06-27 08:41:35

DapperSQL語句

2024-11-19 17:47:05

2019-09-29 16:17:25

Java代碼性能編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 岛国二区| 97起碰| 中文字幕一区二区三区乱码在线 | 国产日韩欧美在线播放 | 性色视频 | 成人av电影免费在线观看 | 成人国产免费视频 | 日本网站免费观看 | 欧美激情久久久 | 久久成人18免费网站 | 精品国产不卡一区二区三区 | 日韩久久精品视频 | 在线看av网址 | 欧美午夜影院 | 欧美精品一区二区三区在线播放 | 国产欧美一区二区三区免费 | 亚洲一区二区三区桃乃木香奈 | 2019天天干夜夜操 | 日韩一区二区免费视频 | 毛片黄 | 免费在线观看h片 | 九热在线| 羞羞视频在线观看 | 午夜精品久久久久久久星辰影院 | 久久精品国产免费看久久精品 | 中文字幕日韩一区 | 成人网在线 | 久久99精品久久久久久琪琪 | 中文字幕日本一区二区 | 国产人成精品一区二区三 | 精品视频 免费 | 久久www免费人成看片高清 | 少妇午夜一级艳片欧美精品 | 91网站在线观看视频 | 永久看片 | 在线国产一区 | 老牛影视av一区二区在线观看 | 久久精品国产一区二区电影 | wwwxxx国产| 欧美一级免费 | 精品国产乱码久久久久久88av |