欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC實(shí)現(xiàn)參數(shù)校驗(yàn)配置方法

 更新時間:2024年03月02日 10:30:12   作者:127.0.0.1  
這篇文章主要介紹了SpringMVC實(shí)現(xiàn)參數(shù)校驗(yàn)的配置方式,Spring MVC會拋出MethodArgumentNotValidException異常,并將錯誤信息綁定到相應(yīng)的字段上,感興趣的朋友跟隨小編一起看看吧

在 Web 應(yīng)用的三層架構(gòu)中,確保在表述層(Presentation Layer)對數(shù)據(jù)進(jìn)行檢查和校驗(yàn)是非常重要的。正確的數(shù)據(jù)校驗(yàn)可以確保業(yè)務(wù)邏輯層(Business Logic Layer)基于有效和合法的數(shù)據(jù)進(jìn)行處理,同時將錯誤的數(shù)據(jù)隔離在業(yè)務(wù)邏輯層之外。這有助于提高系統(tǒng)的健壯性、安全性和可維護(hù)性。

校驗(yàn)概述

JSR-303是Java EE 6中的一項(xiàng)子規(guī)范,也被稱為Bean Validation。這個規(guī)范主要用于對Java Bean中的字段值進(jìn)行驗(yàn)證。JSR-303提供了一套注解和API,方便開發(fā)者在實(shí)體類中對字段進(jìn)行驗(yàn)證,以確保數(shù)據(jù)的合法性。

在JSR-303中,內(nèi)置了許多常用的約束規(guī)則,如@NotNull(非空驗(yàn)證)、@Size(長度驗(yàn)證)、@Range(范圍驗(yàn)證)等。這些注解可以直接應(yīng)用于實(shí)體類的字段上,以聲明驗(yàn)證規(guī)則。同時,JSR-303還提供了驗(yàn)證器(Validator)接口,用于執(zhí)行驗(yàn)證操作。開發(fā)者可以通過注入Validator實(shí)例,或者使用Validation工具類來觸發(fā)驗(yàn)證。

在Spring MVC中,JSR-303得到了很好的支持。開發(fā)者可以在控制器的方法參數(shù)上使用JSR-303的注解,以實(shí)現(xiàn)表單數(shù)據(jù)的自動驗(yàn)證。如果參數(shù)不滿足約束條件,Spring MVC會拋出MethodArgumentNotValidException異常,并將錯誤信息綁定到相應(yīng)的字段上。

常用注解

@NotNull:確保字段值不為null。
@NotBlank:用于String類型參數(shù)校驗(yàn),檢查字符串不能為null且去除首尾空格后長度大于0。
@NotEmpty:主要用于集合校驗(yàn),校驗(yàn)集合不能為null且size大于0,也可以用于String的校驗(yàn),確保字
@Null:確保字段值為null。
@AssertTrue 和 @AssertFalse:用于boolean字段,確保字段值為true或false。
@Min 和 @Max:用于Number和String字段,確保字段值在指定的范圍內(nèi)。
@DecimalMin 和 @DecimalMax:用于BigDecimal,BigInteger,String,byte,short,int,long字段,確保字段值在指定的小數(shù)范圍內(nèi)。需要注意的是,小數(shù)驗(yàn)證存在精度問題。
@Size:用于Collection,Map,Array,String字段,確保字段的長度(或大小)在指定的范圍內(nèi)。
@Digits:用于BigDecimal,BigInteger,String,byte,short,int,long字段,驗(yàn)證值的數(shù)字構(gòu)成是否合法。它有兩個參數(shù),integer表示整數(shù)部分的數(shù)字的位數(shù),fraction表示小數(shù)部分的數(shù)字的位數(shù)。
@Email:用于String字段,驗(yàn)證字段值是否為有效的電子郵件地址。
@Past 和 @Future:用于日期和時間字段,確保日期在過去或未來。
@Pattern:用于String字段,驗(yàn)證字段值是否匹配指定的正則表達(dá)式。
@Range:控制一個數(shù)值的范圍,如數(shù)字、日期等。
@Valid:遞歸地對關(guān)聯(lián)對象進(jìn)行校驗(yàn),如果關(guān)聯(lián)對象是個集合或者數(shù)組,那么對其中的元素進(jìn)行遞歸校驗(yàn);如果是一個map,則對其中的值部分進(jìn)行校驗(yàn)。
@CreditCardNumber:信用卡驗(yàn)證。
@URL:驗(yàn)證一個字符串是否符合URL格式。
@ScriptAssert:使用腳本語言進(jìn)行自定義驗(yàn)證。

@NotNull、@NotEmpty和@NotBlank注解說明

@NotNull、@NotEmpty和@NotBlank都是Java中的注解,用于在運(yùn)行時檢查屬性值是否符合特定條件。它們的使用場景如下:

@NotNull:這個注解用于基本數(shù)據(jù)類型和它們的包裝類(如Integer、Long、Double等),以及String類型。當(dāng)它被用在String類型上時,表示該數(shù)據(jù)不能為null,但可以為空字符串。這個注解一般用在基本數(shù)據(jù)類型的非空校驗(yàn)上,如果被其標(biāo)注的字段使用了@Size、@Max或@Min等注解,那么還可以對字段的數(shù)值大小進(jìn)行控制。此外,@NonNull是JSR 305(缺陷檢查框架)的注解,用于方法或構(gòu)造函數(shù)的參數(shù)上,表明所修飾的參數(shù)不能為null。它會在代碼檢查(靜態(tài)檢查)時給出一個風(fēng)險警告,但運(yùn)行時不會報錯。
@NotEmpty:這個注解用于String、Collection集合、Map、數(shù)組等類型。加了@NotEmpty注解的參數(shù)不能為null,而且長度或大小必須大于0。這個注解一般用在集合類上。

@NotBlank:這個注解只能用于String類型。加了@NotBlank注解的字符串不能為null,而且去除兩端空白字符后的長度(trimmed length)必須大于0。這個注解通常用于前端發(fā)送過來的數(shù)據(jù),先進(jìn)行校驗(yàn)處理,再進(jìn)行邏輯判斷。

總結(jié)來說,@NotNull、@NotEmpty和@NotBlank的使用場景主要取決于你想要驗(yàn)證的數(shù)據(jù)類型和約束條件。@NotNull主要用于基本數(shù)據(jù)類型和String的非空檢查,@NotEmpty主要用于集合類,而@NotBlank則主要用于String類型,要求字符串不為null且去除空白字符后的長度大于0。在實(shí)際開發(fā)中,一定要根據(jù)具體需求選擇合適的注解,否則可能會導(dǎo)致驗(yàn)證邏輯出錯。

操作演示

1.導(dǎo)入依賴

<!--validation-api接口的實(shí)現(xiàn)-->
<dependency>  
    <groupId>org.hibernate.validator</groupId>  
    <artifactId>hibernate-validator</artifactId>  
    <version>6.1.5.Final</version>  
</dependency>  
<!--Java Bean Validation 的規(guī)范接口-->
<dependency>  
    <groupId>javax.validation</groupId>  
    <artifactId>validation-api</artifactId>  
    <version>2.0.1.Final</version>  
</dependency>
<!--Java 注解處理器,它用于在編譯時檢查 JSR-303 注解的正確性和一致性-->
<dependency>
	<groupId>org.hibernate.validator</groupId>
	<artifactId>hibernate-validator-annotation-processor</artifactId>
	<version>6.2.5.Final</version>
</dependency>
 

2.校驗(yàn)實(shí)體對象參數(shù)
實(shí)體類

@Data
public class User {
    @NotBlank
    private String name;
    @NotNull(message = "年齡最小1歲,最大100歲")
    @Range(min = 1 , max = 100)
    private Integer age;
    @NotNull(message = "郵箱不能為空,并且要符合規(guī)范")
    @Email
    private String email;
    @NotNull
    @Size(min = 2,max = 50)
    private String address;
    @Past
    private Date birthday;
    @NotEmpty
    private List<String> users;
}

controller

//實(shí)體對象校驗(yàn)
//在實(shí)體類參數(shù)和 BindingResult 之間不能有任何其他參數(shù), BindingResult可以接受錯誤信息,避免信息拋出!
//@Validated 或 @Valid 代表應(yīng)用校驗(yàn)注解!
@PostMapping("validateObject")
private String validateObject(@Valid @RequestBody User user, BindingResult result) {
	//判斷是否有信息綁定錯誤! 有可以自行處理!
	if (result.hasErrors()) {
		String errorMsg = Objects.requireNonNull(result.getFieldError()).toString();
		System.out.println(errorMsg);
		return "error";
	}
	System.out.println("user=" + user);
	return "success";
}

說明:
@Validated注解是SpringMVC提供的。
@Valid注解是JSR-303提供的。

3.基本類型校驗(yàn)

 //基本類型校驗(yàn)
@GetMapping("validate")
public String validateBasic(@RequestBody @Min(18) Integer age, @RequestBody @NotBlank String name) {
    return "success";
}

配置校驗(yàn)器

說明:一般情況下不需要配置,SpringMVC已經(jīng)配置好默認(rèn)校驗(yàn)器

基于xml配置方式

LocalValidatorFactoryBean 是 Spring 框架提供的一個類,它實(shí)現(xiàn)了 ValidatorFactory 接口。在 Spring 環(huán)境中,LocalValidatorFactoryBean 通常被用作 Bean Validation 的默認(rèn)實(shí)現(xiàn)。Spring 的自動配置通常會為你創(chuàng)建一個 LocalValidatorFactoryBean 實(shí)例,并將其配置為應(yīng)用的默認(rèn) ValidatorFactory。這意味著,當(dāng)你在 Spring 控制器或服務(wù)中使用 @Valid 或 @Validated 注解時,背后實(shí)際上是 LocalValidatorFactoryBean 在執(zhí)行驗(yàn)證邏輯。

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<mvc:annotation-driven validator="validator"/>

基于配置類方式構(gòu)建 ValidatorFactory 實(shí)例。
ValidatorFactory 是一個工廠類,用于生產(chǎn) Validator 實(shí)例,這些 Validator 實(shí)例用于執(zhí)行實(shí)際的驗(yàn)證邏輯。當(dāng)你需要在非 Spring 環(huán)境中進(jìn)行 Bean Validation,或者當(dāng) Spring 的自動配置不能滿足你的需求時,你可以使用這個方法手動配置和獲取 Validator。

@Configuration  
@EnableWebMvc  
public class WebConfig implements WebMvcConfigurer {  
    @Bean  
    public Validator validator() {  
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();  
        return factory.getValidator();  
    }  
}

結(jié)論:
Validation.buildDefaultValidatorFactory():這是 Bean Validation API 的標(biāo)準(zhǔn)方法,用于在非 Spring 環(huán)境中創(chuàng)建 ValidatorFactory。在 Spring 中,除非你有特殊需求需要繞過 Spring 的自動配置,否則通常不會直接使用這個方法。
LocalValidatorFactoryBean:這是 Spring 框架特有的類,用于在 Spring 應(yīng)用中作為默認(rèn)的 ValidatorFactory。在 Spring 應(yīng)用中,你通常不需要直接操作 LocalValidatorFactoryBean,因?yàn)?Spring 會自動為你配置和注入它。但是,如果你需要自定義驗(yàn)證器的配置(例如,更改消息插值器、遍歷提供者等),你可以創(chuàng)建一個 LocalValidatorFactoryBean 的 Bean 并進(jìn)行相應(yīng)的配置。

4.集合校驗(yàn)

//集合校驗(yàn)
@PostMapping("validateList")
public Object validateList(@Valid @RequestBody List<@Positive User> users, BindingResult result) {
	if (result.hasErrors()) {
		Map<String,Object> map = new HashMap<>();
		map.put("code","400");
		map.put("msg","參數(shù)校驗(yàn)失敗,不符合規(guī)則");
		return map;
	}
	System.out.println(users);
	return users;
}

自定義校驗(yàn)注解

1.定義一個注解類,并使用@interface關(guān)鍵字。
2.在注解類上添加@Constraint注解,并指定校驗(yàn)器類。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomValidator.class)
public @interface MyCustomValidation {
    String message() default "該字段不能為空";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

3.創(chuàng)建一個實(shí)現(xiàn)ConstraintValidator接口的校驗(yàn)器類,實(shí)現(xiàn)校驗(yàn)邏輯。

public class MyCustomValidator implements ConstraintValidator<MyCustomValidation,String> {
    @Override
    public void initialize(MyCustomValidation constraintAnnotation) {
        //可以在這里進(jìn)行一些初始化操作
    }
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 自定義校驗(yàn)邏輯:檢查字符串是否為空或僅包含空白字符
        return value != null && !value.trim().isEmpty();
    }
}

4.在需要校驗(yàn)的字段上應(yīng)用自定義注解。

public class CustomValidationEntity {
    @MyCustomValidation
    private String customField;
}

全局異常校驗(yàn)配置

為了優(yōu)雅地處理校驗(yàn)失敗的情況,你可以實(shí)現(xiàn)一個全局異常處理器來捕獲MethodArgumentNotValidException異常,并從中提取錯誤信息。這個異常是如果控制器方法形參不滿足約束條件,Spring MVC會拋出MethodArgumentNotValidException異常,并將錯誤信息綁定到相應(yīng)的字段上。例如:

@ControllerAdvice  
public class GlobalExceptionHandler {  
    @ExceptionHandler(MethodArgumentNotValidException.class)  
    public ResponseEntity<Object> handleValidationExceptions(MethodArgumentNotValidException ex) {  
        BindingResult bindingResult = ex.getBindingResult();  
        Map<String, String> errors = new HashMap<>();  
        for (FieldError fieldError : bindingResult.getFieldErrors()) {  
            errors.put(fieldError.getField(), fieldError.getDefaultMessage());  
        }  
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);  
    }  
}

在這個例子中,GlobalExceptionHandler類使用@ControllerAdvice注解標(biāo)記為一個全局異常處理器。handleValidationExceptions方法則用于處理MethodArgumentNotValidException異常。它從BindingResult中提取錯誤信息,并將這些信息作為響應(yīng)返回給客戶端。

這樣,當(dāng)客戶端發(fā)送一個包含無效數(shù)據(jù)的請求時,服務(wù)器會返回一個包含錯誤信息的響應(yīng),而不是直接拋出異常。

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

相關(guān)文章

  • 如何修改HttpServletRequest中header中的信息

    如何修改HttpServletRequest中header中的信息

    這篇文章主要介紹了如何修改HttpServletRequest中header中的信息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java設(shè)計模式之觀察者模式

    Java設(shè)計模式之觀察者模式

    本文詳細(xì)講解了Java設(shè)計模式之觀察者模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 聊聊java多線程創(chuàng)建方式及線程安全問題

    聊聊java多線程創(chuàng)建方式及線程安全問題

    線程被稱為輕量級進(jìn)程,是程序執(zhí)行的最小單位,它是指在程序執(zhí)行過程中,能夠執(zhí)行代碼的一個執(zhí)行單位。接下來通過本文給大家介紹java多線程創(chuàng)建方式及線程安全問題,感興趣的朋友一起看看吧
    2022-01-01
  • 關(guān)于使用jpa聚合函數(shù)遇到的問題

    關(guān)于使用jpa聚合函數(shù)遇到的問題

    這篇文章主要介紹了關(guān)于使用jpa聚合函數(shù)遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java實(shí)現(xiàn)的微信圖片處理工具類【裁剪,合并,等比例縮放等】

    Java實(shí)現(xiàn)的微信圖片處理工具類【裁剪,合并,等比例縮放等】

    這篇文章主要介紹了Java實(shí)現(xiàn)的微信圖片處理工具類,可實(shí)現(xiàn)針對圖片的裁剪、合并、等比例縮放、旋轉(zhuǎn)、識別等各種常見的圖片處理功能,需要的朋友可以參考下
    2017-11-11
  • Idea設(shè)置spring boot應(yīng)用配置參數(shù)的兩種方式

    Idea設(shè)置spring boot應(yīng)用配置參數(shù)的兩種方式

    本文通過兩個方式介紹Idea設(shè)置spring boot應(yīng)用配置參數(shù),一種是配置VM options的參數(shù)時要以:-DparamName的格式設(shè)置參數(shù),第二種可以參考下本文詳細(xì)設(shè)置,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • Maven本地jar引用的實(shí)現(xiàn)方法

    Maven本地jar引用的實(shí)現(xiàn)方法

    這篇文章主要介紹了Maven本地jar引用的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • Java之多個線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)

    Java之多個線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)

    這篇文章主要介紹了Java之多個線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java ArrayList擴(kuò)容機(jī)制原理深入分析

    Java ArrayList擴(kuò)容機(jī)制原理深入分析

    在Java中,ArrayList是最常用的集合之一。它是一種容器,它的內(nèi)部定義了一個Object類型的數(shù)組elementData,因此可用于存儲任意類型的數(shù)據(jù)。我們知道,數(shù)組是長度恒定的。而ArrayList相當(dāng)于是一個長度可變的動態(tài)數(shù)組,一起來看看的它的擴(kuò)容機(jī)制
    2023-02-02
  • java9開始——接口中可以定義private私有方法

    java9開始——接口中可以定義private私有方法

    這篇文章主要介紹了從java9開始 接口中可以定義private私有方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10

最新評論