最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot中的Validation參數(shù)校驗詳解

 更新時間:2023年10月08日 09:47:35   作者:__如風(fēng)__  
這篇文章主要介紹了Springboot中的Validation參數(shù)校驗詳解,Springboot參數(shù)校驗是一種常用的驗證機(jī)制,在傳遞參數(shù)時進(jìn)行校驗,以確保參數(shù)的有效性和正確性,該機(jī)制可以幫助開發(fā)者在代碼實現(xiàn)前就避免一些常見的錯誤,需要的朋友可以參考下

Springboot 參數(shù)校驗

參考文檔

Springboot項目中,引入依賴

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

基本的使用網(wǎng)上有很多教程,就不介紹了。

關(guān)于使用

  • 校驗@RequestParam、@PathVariable等,只需在controller類上加@Validated注解
  • 校驗JavaBean,在controlle上注解@Validated且在參數(shù)前加@Validated

下面以該類為例

@Data
public class TestParam {
    /**
     * insert時要求為null
     */
    @Null(groups = Insert.class)
    /**
     * update時要求不為空
     */
    @NotEmpty(groups = Update.class)
    private List<@NotNull Long> ids;
    @EnumValue(value = Gender.class)
    private String gender;
    @Valid
    private List<@NotNull Pet> pets;
    /**
     * 默認(rèn)分組為default,若不繼承
     * Validated指定分組后,非指定分組將失效
     */
    public interface Insert extends Default {
    }
    public interface Update extends Default {
    }
}
@Data
public class Pet {
    @Size(min = 1, max = 5)
    private String name;
}

分組校驗

分組校驗有點類似Jackson序列化的JsonView,不同的情況下采取不同的策略,例如,注冊時賬戶名必須在數(shù)據(jù)庫中唯一,而登錄時賬戶必須在數(shù)據(jù)庫中存在,這個時候就需要為校驗設(shè)置分組了。 情況一

@PostMapping("/insert")
public TestParam insert(@RequestBody @Validated(TestParam.Insert.class) TestParam param) {
	return param;
}

insert.png

情況二

@PostMapping("/update")
public TestParam update(@RequestBody @Validated(TestParam.Update.class) TestParam param) {
        return param;
}

update.png

自定義校驗

如下為自定義枚舉值校驗,用于解決屬性定義不是enum類型,但想約束其值為枚舉類型,例如上面的gender,假如定義為Gender,那么默認(rèn)只能MALE或者FEMALE,想要男、女也通過校驗,可以使用該注解

@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValue {
    String message() default "錯誤的枚舉值";
    EnumValidateBy by() default EnumValidateBy.TOSTRING;
    Class<? extends Enum<?>> targetEnum();
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
public enum EnumValidateBy {
    /**
     * 使用枚舉類的哪個值校驗
     * 如MAEL("男"), FEMALE("女")
     * NAME 值必須為MAEL或者FEMALE
     * TOSTRING 重寫toString方法返回男或者女, 值必須為男或者女
     * BOTH 以上值均可
     */
    BOTH, NAME, TOSTRING
}

實現(xiàn)ConstraintValidator接口校驗

public class EnumValidator implements ConstraintValidator<EnumValue, String> {
    private final Set<String> set = new HashSet<>(8);
    @Override
    public void initialize(EnumValue constraintAnnotation) {
        Class<? extends Enum<?>> enumCls = constraintAnnotation.targetEnum();
        EnumValidateBy by = constraintAnnotation.by();
        Enum<?>[] constants = enumCls.getEnumConstants();
        if (by == EnumValidateBy.NAME) {
            set.addAll(Arrays.stream(constants).map(Enum::name).collect(Collectors.toSet()));
        } else if (by == EnumValidateBy.TOSTRING) {
            set.addAll(Arrays.stream(constants).map(Enum::toString).collect(Collectors.toSet()));
        } else {
            set.addAll(Arrays.stream(constants).map(Enum::name).collect(Collectors.toSet()));
            set.addAll(Arrays.stream(constants).map(Enum::toString).collect(Collectors.toSet()));
        }
    }
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return set.contains(value);
    }
}

枚舉.png

null不在set中,校驗不通過

集合元素校驗

基本類型

直接在泛型參數(shù)上加上需要的注解即可

泛型基本類型.png

JavaBean類型

  • 如僅對整個JavaBean進(jìn)行校驗,例如@NotNull注解,直接將注解寫在泛型參數(shù)即可
  • 如需對集合中每個JavaBean的屬性進(jìn)行校驗,還需加上@Valid注解,如上面的pets

泛型JavaBean.png

快速失敗模式

hibernate官網(wǎng)的配置如下:

ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
        .configure()
        .addProperty( "hibernate.validator.fail_fast", "true" )
        .buildValidatorFactory();
Validator validator = validatorFactory.getValidator();

只要往容器中注入Validator對象就行了。 因為spring自動配置好了,但沒有開啟快速失敗模式,最后,參照Springboot自動配置的ValidationAutoConfiguration,只添加了快速失敗部分,其余未做改動。

@Configuration
public class ValidationConfig {
    @Bean
    public Validator validatorFactory(ApplicationContext context) {
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean() {
            @Override
            protected void postProcessConfiguration(javax.validation.Configuration<?> configuration) {
                configuration.addProperty("hibernate.validator.fail_fast", "true");
            }
        };
        MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory(context);
        factoryBean.setMessageInterpolator(interpolatorFactory.getObject());
        return factoryBean;
    }
}

總結(jié)

Springboot 參數(shù)校驗是一種有效的驗證機(jī)制,可以避免常見的錯誤,并提高程序的健壯性和穩(wěn)定性。它的實現(xiàn)方式基于Java Bean驗證框架,通過添加注解的方式,對屬性值進(jìn)行校驗。開發(fā)者只需要在程序中加入相關(guān)注解即可完成參數(shù)的校驗,從而提高了程序的開發(fā)效率和穩(wěn)定性。

  • 在controller層使用
  • 分組時記得繼承Default接口
  • 集合嵌套校驗
  • 快速失敗模式

到此這篇關(guān)于Springboot中的Validation參數(shù)校驗詳解的文章就介紹到這了,更多相關(guān)Validation參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java堆空間爆滿導(dǎo)致宕機(jī)的問題分析及解決

    Java堆空間爆滿導(dǎo)致宕機(jī)的問題分析及解決

    團(tuán)隊有一個服務(wù),一直運(yùn)行的好好的,突然訪問異常了,先是請求超時,然后直接無法訪問,本文將給大家介紹Java堆空間爆滿導(dǎo)致宕機(jī)的問題分析及解決,需要的朋友可以參考下
    2024-02-02
  • 解析Java8 Stream原理

    解析Java8 Stream原理

    說起 Java 8,我們知道 Java 8 大改動之一就是增加函數(shù)式編程,而 Stream API 便是函數(shù)編程的主角,Stream API 是一種流式的處理數(shù)據(jù)風(fēng)格,也就是將要處理的數(shù)據(jù)當(dāng)作流,在管道中進(jìn)行傳輸,并在管道中的每個節(jié)點對數(shù)據(jù)進(jìn)行處理,如過濾、排序、轉(zhuǎn)換等
    2021-06-06
  • java時間 java.util.Calendar深入分析

    java時間 java.util.Calendar深入分析

    這篇文章主要介紹了java時間 java.util.Calendar深入分析的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 圖解Spring容器中實例化bean的四種方式

    圖解Spring容器中實例化bean的四種方式

    這篇文章主要介紹了圖解Spring容器中實例化bean的四種方式,傳統(tǒng)應(yīng)用程序可以通過new和反射方式進(jìn)行實例化Bean,而Spring IOC容器則需要根據(jù) Bean 定義里的配置元數(shù)據(jù),使用反射機(jī)制來創(chuàng)建Bean,需要的朋友可以參考下
    2023-11-11
  • eclipse 安裝lombok插件

    eclipse 安裝lombok插件

    這篇文章主要介紹了eclipse 安裝lombok插件的詳細(xì)步驟,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解

    mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解

    這篇文章主要介紹了mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java實現(xiàn)學(xué)生管理系統(tǒng)詳解流程

    Java實現(xiàn)學(xué)生管理系統(tǒng)詳解流程

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java利用POI讀寫Excel文件工具類

    Java利用POI讀寫Excel文件工具類

    這篇文章主要為大家詳細(xì)介紹了Java利用POI讀寫Excel文件的工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題剖析

    SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題剖析

    使用了SpringBoot的項目,在遠(yuǎn)程連接Redis服務(wù)器時,會遇倒一些小問題,下面通過本文給大家全面解析SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題,需要的朋友參考下吧
    2017-04-04
  • MyBatis 動態(tài)拼接Sql字符串的問題

    MyBatis 動態(tài)拼接Sql字符串的問題

    MyBatis的動態(tài)SQL,解決了SQL字符串拼接的痛苦。下文分步驟給大家詳細(xì)介紹了MyBatis 動態(tài)拼接Sql字符串的問題,非常不錯,感興趣的朋友一起看下吧
    2016-08-08

最新評論

交口县| 武宁县| 珠海市| 牟定县| 大埔县| 唐海县| 三原县| 靖西县| 富裕县| 通江县| 南汇区| 南木林县| 竹北市| 武汉市| 赤水市| 寿宁县| 五家渠市| 平远县| 罗江县| 沙田区| 襄垣县| 桐城市| 商河县| 十堰市| 惠安县| 万安县| 新沂市| 青铜峡市| 澎湖县| 沙湾县| 江口县| 九江市| 工布江达县| 泊头市| 涞源县| 大关县| 北流市| 璧山县| 临沭县| 穆棱市| 乐都县|