日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-11-07 09:13:52 231觀看
導(dǎo)讀環(huán)境:Springboot2.6.121. 簡介Spring Validation是一種輕量級的數(shù)據(jù)驗證框架,主要用于對Java對象進行校驗。它為數(shù)據(jù)驗證提供了統(tǒng)一的接口和基本的校驗功能,解決了數(shù)據(jù)校驗這一常見問題,讓開發(fā)人員能夠方便地對數(shù)據(jù)進行驗

環(huán)境:Springboot2.6.12siI28資訊網(wǎng)——每日最新資訊28at.com

1. 簡介

Spring Validation是一種輕量級的數(shù)據(jù)驗證框架,主要用于對Java對象進行校驗。它為數(shù)據(jù)驗證提供了統(tǒng)一的接口和基本的校驗功能,解決了數(shù)據(jù)校驗這一常見問題,讓開發(fā)人員能夠方便地對數(shù)據(jù)進行驗證,從而保證數(shù)據(jù)的有效性和安全性。siI28資訊網(wǎng)——每日最新資訊28at.com

Spring Validation提供了一套注解,用于對Java對象進行校驗,支持嵌套校驗和分組校驗,支持國際化和自定義注解和校驗器,可以滿足各種復(fù)雜的校驗需求。它的主要特點包括:siI28資訊網(wǎng)——每日最新資訊28at.com

  1. 輕量級:Spring Validation只做驗證相關(guān)的事情,不包含復(fù)雜的業(yè)務(wù)邏輯。
  2. 簡單易用:基于注解,簡潔明了,易于維護。
  3. 校驗規(guī)則靈活:支持自定義校驗規(guī)則,可擴展性強。
  4. 支持國際化:根據(jù)不同的語言環(huán)境,使用不同的校驗提示消息。
  5. 集成Hibernate Validator:Spring Validation默認使用Hibernate Validator作為其具體的實現(xiàn),可以輕松地與其他數(shù)據(jù)驗證框架一起工作。

siI28資訊網(wǎng)——每日最新資訊28at.com

Bean Validation 為Java應(yīng)用程序提供了一種通過約束聲明和元數(shù)據(jù)進行驗證的通用方法。要使用它,只需要對POJO屬性進行注釋,然后由運行時強制執(zhí)行這些約束。有內(nèi)置的約束,你也可以定義自己的自定義約束。如下所示:siI28資訊網(wǎng)——每日最新資訊28at.com

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

Bean驗證驗證器然后根據(jù)聲明的約束驗證此類的實例。有關(guān)API的一般信息,請參見Bean驗證。有關(guān)特定約束,請參閱Hibernate驗證程序文檔。siI28資訊網(wǎng)——每日最新資訊28at.com

配置Bean驗證提供程序

Spring提供了對Bean驗證API的全面支持,包括將Bean驗證提供者作為Spring Bean。這使你可以在應(yīng)用程序中需要驗證的任何位置注入javax.validation.ValidatorFactory或javax.validation.Validator。siI28資訊網(wǎng)——每日最新資訊28at.com

你可以使用LocalValidatorFactoryBean將默認驗證器配置為Spring Bean,如下例所示:siI28資訊網(wǎng)——每日最新資訊28at.com

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

上面的示例中的基本配置使用默認引導(dǎo)機制觸發(fā)bean驗證進行初始化。Bean驗證提供程序(如Hibernate驗證程序)應(yīng)該出現(xiàn)在類路徑中,并被自動檢測到。siI28資訊網(wǎng)——每日最新資訊28at.com

siI28資訊網(wǎng)——每日最新資訊28at.com

2. 注入 Validator

siI28資訊網(wǎng)——每日最新資訊28at.com

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

簡單實例

接著上面的配置,我們只需要做驗證動作即可。siI28資訊網(wǎng)——每日最新資訊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驗證約束由兩部分組成:siI28資訊網(wǎng)——每日最新資訊28at.com

  • 聲明約束及其可配置屬性的@Constraint注釋。
  • 實現(xiàn)約束行為的javax.validation.ConstraintValidator接口的實現(xiàn)。

要將聲明與實現(xiàn)關(guān)聯(lián),每個@Constraint注釋都會引用相應(yīng)的ConstraintValidator實現(xiàn)類。在運行時,當域模型中遇到約束注釋時,ConstraintValidatorFactory將實例化引用的實現(xiàn)。下面的示例實現(xiàn)一個前綴匹配的驗證邏輯:siI28資訊網(wǎng)——每日最新資訊28at.com

siI28資訊網(wǎng)——每日最新資訊28at.com

自定義注解siI28資訊網(wǎng)——每日最新資訊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 { };}

以上的注解屬性都是必須的。siI28資訊網(wǎng)——每日最新資訊28at.com

注意message屬性是我們將發(fā)生錯誤后錯誤信息定義在配置文件中,而該文件的basename必須是ValidationMessages,如果你需要國際化支持,那么就這樣命名:ValidationMessages_zh_CN.properties。siI28資訊網(wǎng)——每日最新資訊28at.com

siI28資訊網(wǎng)——每日最新資訊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() ;  }}

驗證器必須實現(xiàn)ConstraintValidator接口,該接口是泛型接口,第一個參數(shù)是該驗證器要用于在那個注解,第二個參數(shù)是該注解應(yīng)用在什么數(shù)據(jù)類型上。注意:在自定義驗證器中我們是可以隨意地注入其它Bean對象,是不是很強大?siI28資訊網(wǎng)——每日最新資訊28at.com

基于方法級的驗證

你可以通過MethodValidationPostProcessor Bean定義將Bean validation 1.1(以及Hibernate Validator 4.3的自定義擴展)支持的方法驗證功能集成到Spring上下文中:siI28資訊網(wǎng)——每日最新資訊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注解,而方法則是攔截所有的方法。siI28資訊網(wǎng)——每日最新資訊28at.com

siI28資訊網(wǎng)——每日最新資訊28at.com

測試

圖片siI28資訊網(wǎng)——每日最新資訊28at.com

這里是拋出的異常javax.validation.ConstraintViolationException,所有我們需要一個全局的異常攔截器來對異常做處理。siI28資訊網(wǎng)——每日最新資訊28at.com

其他配置選項

默認的LocalValidatoryFactoryBean配置對于大多數(shù)情況都足夠了。對于各種Bean驗證構(gòu)造,有許多配置選項,從消息插值到遍歷解析。有關(guān)這些選項的更多信息,請參閱LocalValidatorFactoryBean Javadoc。siI28資訊網(wǎng)——每日最新資訊28at.com

https://docs.spring.io/spring-framework/docs/5.3.11/javadoc-api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.htmlsiI28資訊網(wǎng)——每日最新資訊28at.com

siI28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-17391-0.htmlAPI接口參數(shù)驗證的必備神器,讓你的代碼更高效!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 了不起的Base64

下一篇: 使用漏桶算法實現(xiàn)一秒鐘50個限流

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 柳河县| 绵竹市| 额济纳旗| 祁阳县| 津南区| 江北区| 光泽县| 福建省| 全椒县| 永吉县| 永城市| 东丽区| 阜阳市| 佳木斯市| 松桃| 长子县| 新巴尔虎右旗| 富顺县| 万宁市| 南漳县| 康马县| 防城港市| 沅江市| 海盐县| 阿拉善右旗| 黄平县| 黄石市| 邻水| 达日县| 布拖县| 大方县| 贵阳市| 灌云县| 格尔木市| 宝应县| 永仁县| 锡林浩特市| 财经| 诸暨市| 连江县| 武城县|