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

利用Spring Validation實(shí)現(xiàn)輸入驗(yàn)證功能

 更新時(shí)間:2023年06月18日 14:42:41   作者:半畝方塘立身  
這篇文章主要給大家介紹了如何利用Spring Validation完美的實(shí)現(xiàn)輸入驗(yàn)證功能,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的朋友可以借鑒一下

概述

校驗(yàn)例子

大家平時(shí)編碼中經(jīng)常涉及參數(shù)的校驗(yàn),對(duì)于一個(gè)用戶注冊(cè)的方法來(lái)說(shuō)會(huì)校驗(yàn)用戶名密碼信息:

public class UserController {
    public ResponseEntity<String> registerUser(String username, String password) {
        if (username == null || username.isEmpty()) {
            return ResponseEntity.badRequest().body("用戶名不能為空");
        }
        if (password == null || password.isEmpty()) {
            return ResponseEntity.badRequest().body("密碼不能為空");
        }
        if (password.length() < 6) {
            return ResponseEntity.badRequest().body("密碼長(zhǎng)度至少為6位");
        }
        // 處理用戶注冊(cè)邏輯
        return ResponseEntity.ok("用戶注冊(cè)成功");
    }
}

上述例子中需要手動(dòng)編寫參數(shù)校驗(yàn)邏輯的過(guò)程。雖然對(duì)于這個(gè)簡(jiǎn)單的示例而言,手動(dòng)編寫校驗(yàn)邏輯可能是可行的,但是對(duì)于復(fù)雜的驗(yàn)證規(guī)則和多個(gè)參數(shù)的情況,手動(dòng)編寫校驗(yàn)邏輯會(huì)變得冗長(zhǎng)、難以維護(hù)和復(fù)用。

引入現(xiàn)代的校驗(yàn)框架如Spring Validation可以幫助解決這些問(wèn)題,提供更高效、統(tǒng)一和可維護(hù)的參數(shù)校驗(yàn)方案。

Bean Validation規(guī)范

  • JSR303/JSR-349/JSR-380: JSR303(Bean Validation)是一項(xiàng)標(biāo)準(zhǔn),只提供規(guī)范不提供實(shí)現(xiàn),規(guī)定一些校驗(yàn)規(guī)范即校驗(yàn)注解,如@Null,@NotNull,@Pattern,位于javax.validation.constraints包下。JSR-349(Bean Validation 1.1)是其的升級(jí)版本,添加了一些新特性。JSR-380(Bean Validation 2.0,JSR380標(biāo)準(zhǔn) )對(duì)其規(guī)范進(jìn)一步擴(kuò)展和增強(qiáng)。
  • hibernate validationhibernate validation是對(duì)這個(gè)規(guī)范的實(shí)現(xiàn),并增加了一些其他校驗(yàn)注解,如@Email,@Length,@Range等等
  • Spring validationspring validation對(duì)hibernate validation進(jìn)行了二次封裝,在springmvc模塊中添加了自動(dòng)校驗(yàn),并將校驗(yàn)信息封裝進(jìn)了特定的類中

Bean Validation的主頁(yè):Jakarta Bean Validation - Home

Bean Validation的參考實(shí)現(xiàn):GitHub - hibernate/hibernate-validator: Hibernate Validator - Jakarta Bean Validation Reference Implementation

相關(guān)版本兼容性

Bean ValidationHibernate ValidationJDKSpring Boot
1.15.4 +6+1.5.x
2.06.0 +8+2.0.x
3.07.0 +9+2.0.x

3.0后Bean Validation改名為Jakarta Bean Validation 3.0了。 如果你的項(xiàng)目版本是jdk1.8的,不要使用hibernate-validator 7.0的版本,它里面的依賴的jakarta.validation-api:3.0是需要jdk1.9的部分支持的。

Spring Validation注解

Spring Validation建立在Java Bean Validation(JSR 380)的基礎(chǔ)上,為開發(fā)人員提供了一組注解和工具,用于定義和執(zhí)行數(shù)據(jù)驗(yàn)證規(guī)則。它允許開發(fā)人員在應(yīng)用程序中定義驗(yàn)證規(guī)則,并使用這些規(guī)則來(lái)驗(yàn)證輸入數(shù)據(jù)、請(qǐng)求參數(shù)、領(lǐng)域?qū)ο蟮取?/p>

@Validated:可以用在類型、方法和方法參數(shù)上。但是不能用在成員屬性(字段)上

@Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(字段)上

常用注解標(biāo)簽如下:

標(biāo)簽說(shuō)明
@Null限制只能為null
@NotNull限制必須不為null
@AssertFalse限制必須為false
@AssertTrue限制必須為true
@DecimalMax(value)限制必須為一個(gè)不大于指定值的數(shù)字
@DecimalMin(value)限制必須為一個(gè)不小于指定值的數(shù)字
@Digits(integer,fraction)限制必須為一個(gè)小數(shù),且整數(shù)部分的位數(shù)不能超過(guò)integer,小數(shù)部分的位數(shù)不能超過(guò)fraction
@Future限制必須是一個(gè)將來(lái)的日期
@Max(value)限制必須為一個(gè)不大于指定值的數(shù)字
@Min(value)限制必須為一個(gè)不小于指定值的數(shù)字
@Past限制必須是一個(gè)過(guò)去的日期
@Pattern(value)限制必須符合指定的正則表達(dá)式
@Size(max,min)限制字符長(zhǎng)度必須在min到max之間
@Past驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早
@NotEmpty驗(yàn)證注解的元素值不為null且不為空(字符串長(zhǎng)度不為0、集合大小不為0)
@NotBlank驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長(zhǎng)度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的空格
@Email驗(yàn)證注解的元素值是Email,也可以通過(guò)正則表達(dá)式和flag指定自定義的email格式

hibernate-validator 校驗(yàn)Java Bean

  • pom引入hibernate-validator
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.0.Final</version>
</dependency>
  • 創(chuàng)建一個(gè)Java Bean,我們校驗(yàn)一下用戶名跟年齡
public class User {
    @NotBlank(message = "用戶名不能為空")
    private String username;
    @Min(value = 18, message = "年齡不能小于18歲")
    private int age;
    // 構(gòu)造函數(shù)、Getter 和 Setter 方法
}
  • 執(zhí)行校驗(yàn)
public class ValidatorTest {
    public static void main(String[] args) {
        // 創(chuàng)建校驗(yàn)器
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        // 創(chuàng)建用戶對(duì)象
        User user = new User();
        user.setUsername("");
        user.setAge(16);
        // 執(zhí)行校驗(yàn)
        Set<ConstraintViolation<User>> violations = validator.validate(user);
        // 處理校驗(yàn)結(jié)果
        if (!violations.isEmpty()) {
            for (ConstraintViolation<User> violation : violations) {
                System.out.println(violation.getMessage());
            }
        } else {
            System.out.println("校驗(yàn)通過(guò)");
        }
    }
}

用Spring Validation提高生產(chǎn)力

Spring Validation引入

添加pom依賴

Spring Validation校驗(yàn)包被獨(dú)立成了一個(gè)starter組件,引入如下依賴:

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

如果是spring-boot-starter-web不用引入了,spring-boot-starter-web 集成了spring-boot-starter-validation,默認(rèn)可以不加spring-boot-starter-validation,它同時(shí)也集成了hibernate-validator

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

hibernate Validator校驗(yàn)器

這里我們定義hibernate校驗(yàn)器用于校驗(yàn)參數(shù)

@Configuration
@EnableAutoConfiguration
public class HibernateValidatorConfiguration {
	@Bean
	public MethodValidationPostProcessor methodValidationPostProcessor() {
		MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
		processor.setValidator(validator());
		processor.setProxyTargetClass(true);
		return processor;
	}
	@Bean
	public Validator validator() {
		return Validation
				.byProvider(HibernateValidator.class)
				.configure()
				.addProperty("hibernate.validator.fail_fast", "true")
				.buildValidatorFactory()
				.getValidator();
	}
}

全局異常處理

每個(gè)Controller方法中都如果都寫一遍對(duì)校驗(yàn)結(jié)果信息的處理,使用起來(lái)還是很繁瑣。可以通過(guò)全局異常處理的方式統(tǒng)一處理校驗(yàn)異常。

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler(value = ConstraintViolationException.class)
	@ResponseBody
	public ApiResult defaultInsuranceExceptionHandler(ConstraintViolationException e) {
		log.error("校驗(yàn)錯(cuò)誤:{}", e.getMessage());
		return ApiResult.error("error", e.getMessage());
	}
	@ExceptionHandler(value = MissingServletRequestParameterException.class)
	@ResponseBody
	public ApiResult handleMissingServletRequestParameter(MissingServletRequestParameterException ex) {
		String error = ex.getParameterName() + " 參數(shù)為空";
		return ApiResult.error("error", error);
	}
}

Controller接口Bean校驗(yàn)

首先,假設(shè)我們有一個(gè)用戶注冊(cè)的請(qǐng)求對(duì)象 UserRegistrationRequest,其中包含用戶名和密碼字段。

@Data
public class UserRegistrationRequest {
    @NotBlank(message = "用戶名不能為空")
    private String username;
    @NotBlank(message = "密碼不能為空")
    @Size(min = 6, message = "密碼長(zhǎng)度至少為6位")
    private String password;
}

我們使用了兩個(gè)注解進(jìn)行參數(shù)校驗(yàn):

  • @NotBlank:該注解用于驗(yàn)證字段不能為空或空格,并可以通過(guò) message 屬性指定驗(yàn)證失敗時(shí)的錯(cuò)誤消息。
  • @Size:該注解用于驗(yàn)證字段的長(zhǎng)度,我們指定了密碼的最小長(zhǎng)度為6,并通過(guò) message 屬性定義了驗(yàn)證失敗時(shí)的錯(cuò)誤消息。

接下來(lái)我們定義一個(gè)Controller接口

@RestController
public class UserController {
    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@Valid @RequestBody UserRegistrationRequest request) {
        // 處理用戶注冊(cè)邏輯
        return ResponseEntity.ok("用戶注冊(cè)成功");
    }
}

@RequestParam 參數(shù)校驗(yàn)

首先需要將MethodValidationPostProcessor設(shè)置成cglib代理

processor.setProxyTargetClass(true);

controller實(shí)現(xiàn)

@RestController
public class ValidController implements ValidClient {
	@Override
	public String queryById(Integer id) {
		return "id:" + id;
	}
}

分組校驗(yàn)

還是看上面那個(gè)Controller接口校驗(yàn)的例子,如果我們注冊(cè)的時(shí)候需要校驗(yàn)用戶名和密碼,重置密碼的時(shí)候只校驗(yàn)密碼該怎么校驗(yàn)?zāi)兀窟@個(gè)時(shí)候就用到了分組校驗(yàn)了。

  • 首先,我們需要定義一個(gè)新的分組,用于更新場(chǎng)景中的驗(yàn)證,例如UpdateGroup。
public interface UpdateGroup {
}

  • 接下來(lái),我們需要在UserRegistrationRequest類的username字段上使用@Validated注解,并通過(guò)groups屬性指定要應(yīng)用的驗(yàn)證分組。
public class UserRegistrationRequest {
    @NotBlank(message = "用戶名不能為空", groups = {RegistrationGroup.class})
    private String username;
    @NotBlank(message = "密碼不能為空")
    @Size(min = 6, message = "密碼長(zhǎng)度至少為6位")
    private String password;
    // 其他字段和方法
}

在上述示例中,我們將@Validated注解應(yīng)用到username字段,并通過(guò)groups屬性指定了RegistrationGroup.class,這意味著在注冊(cè)場(chǎng)景中會(huì)進(jìn)行校驗(yàn)。

  • 我們可以使用@Validated注解來(lái)指定不要應(yīng)用任何驗(yàn)證分組。
@RestController
public class UserController {
    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@Validated(RegistrationGroup.class) @RequestBody UserRegistrationRequest request) {
        // 處理用戶注冊(cè)邏輯
        return ResponseEntity.ok("用戶注冊(cè)成功");
    }
    @PostMapping("/update")
    public ResponseEntity<String> updateUser(@Validated(UpdateGroup.class) @RequestBody UserRegistrationRequest request) {
        // 處理用戶更新邏輯
        return ResponseEntity.ok("用戶更新成功");
    }
}

在上述示例中,我們?cè)?code>updateUser方法中使用@Validated(UpdateGroup.class)來(lái)指定在更新場(chǎng)景中只執(zhí)行UpdateGroup分組的驗(yàn)證規(guī)則。由于username字段上沒(méi)有指定groups屬性,所以在更新場(chǎng)景中將不會(huì)對(duì)username字段進(jìn)行校驗(yàn)。

自定義注解

Spring 的 validation 為我們提供了許多特性,幾乎可以滿足日常開發(fā)中絕大多數(shù)參數(shù)校驗(yàn)場(chǎng)景了。但是,一個(gè)好的框架一定是方便擴(kuò)展的。有了擴(kuò)展能力,就能應(yīng)對(duì)更多復(fù)雜的業(yè)務(wù)場(chǎng)景,下面我們自定義一個(gè)日期格式校驗(yàn)的注解

定義注解接口

@Documented
@Constraint(validatedBy = DateFormatValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DateFormat {
	//默認(rèn)錯(cuò)誤消息
	String message() default "時(shí)間格式錯(cuò)誤";
	//分組
	Class<?>[] groups() default {};
	//默認(rèn)日期格式
	String formatter() default "yyyy-MM-dd";
	//負(fù)載
	Class<? extends Payload>[] payload() default {};
	@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
	@Retention(RetentionPolicy.RUNTIME)
	@Documented
	@interface List {
		DateFormat[] value();
	}
}

定義校驗(yàn)器

public class DateFormatValidator implements ConstraintValidator<DateFormat, String> {
	protected String dateFormatter;
	@Override
	public void initialize(DateFormat constraintAnnotation) {
		this.dateFormatter = constraintAnnotation.formatter();
	}
	@Override
	public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
		if (StringUtils.isNotBlank(value)) {
			try {
				DateUtils.parseDate(value, dateFormatter);
			} catch (Exception e) {
				return false;
			}
			return true;
		}
		return false;
	}
}

自定義校驗(yàn)注解使用起來(lái)和官方注解沒(méi)有區(qū)別,在需要的字段上添加相應(yīng)注解即可。

public class RequestParam {
    @DateFormat(message = "日期輸入錯(cuò)誤")
    private String beginDate;
    // 其他字段和方法
}

以上就是利用Spring Validation實(shí)現(xiàn)輸入驗(yàn)證功能的詳細(xì)內(nèi)容,更多關(guān)于Spring Validation輸入驗(yàn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java中每月等額與先息后本計(jì)算

    java中每月等額與先息后本計(jì)算

    一般信用貸款會(huì)提供兩種還款方式:每月等額或者先息后本。每月等額,就是每月歸還等同的部分本金和利息,你手里在使用的本金其實(shí)是逐月減少的。先息后本就是先還利息,到期歸還本金。本文將介紹他們的實(shí)現(xiàn)方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-03-03
  • Java字符串去除特殊字符內(nèi)容的實(shí)例

    Java字符串去除特殊字符內(nèi)容的實(shí)例

    下面小編就為大家分享一篇Java字符串去除特殊字符內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • SpringBoot解決yml明文密碼問(wèn)題的方法

    SpringBoot解決yml明文密碼問(wèn)題的方法

    在現(xiàn)代的軟件開發(fā)中,安全性是一個(gè)重要的考量因素,對(duì)于使用SpringBoot框架開發(fā)的應(yīng)用程序而言,敏感信息如數(shù)據(jù)庫(kù)密碼、API密鑰等通常存儲(chǔ)在YAML配置文件中,而這些文件往往是明文存儲(chǔ),存在安全隱患,所以本文介紹了SpringBoot解決yml明文密碼問(wèn)題的方法
    2024-07-07
  • SpringBoot實(shí)現(xiàn)敏感詞過(guò)濾功能示例

    SpringBoot實(shí)現(xiàn)敏感詞過(guò)濾功能示例

    本文主要介紹了SpringBoot實(shí)現(xiàn)敏感詞過(guò)濾功能示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Spring實(shí)現(xiàn)類私有方法的幾個(gè)問(wèn)題(親測(cè)通用解決方案)

    Spring實(shí)現(xiàn)類私有方法的幾個(gè)問(wèn)題(親測(cè)通用解決方案)

    現(xiàn)實(shí)的業(yè)務(wù)場(chǎng)景中,可能需要對(duì)Spring的實(shí)現(xiàn)類的私有方法進(jìn)行測(cè)試。本文給大家分享Spring實(shí)現(xiàn)類私有方法面臨的幾個(gè)問(wèn)題及解決方案,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • Spring 配置文件字段注入到List、Map

    Spring 配置文件字段注入到List、Map

    這篇文章主要介紹了Spring 配置文件字段注入到List、Map,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • JAVA序列化Serializable及Externalizable區(qū)別詳解

    JAVA序列化Serializable及Externalizable區(qū)別詳解

    這篇文章主要介紹了JAVA序列化Serializable及Externalizable區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot3快速整合MyBatisPlus的示例代碼

    SpringBoot3快速整合MyBatisPlus的示例代碼

    本文介紹了快速整合MyBatis-Plus到Spring Boot 3項(xiàng)目中,包括依賴引入、代碼生成器使用等,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Java 常見異常(Runtime Exception )詳細(xì)介紹并總結(jié)

    Java 常見異常(Runtime Exception )詳細(xì)介紹并總結(jié)

    這篇文章主要介紹了Java 常見異常(Runtime Exception )詳細(xì)介紹并相關(guān)資料,大家在開發(fā)Java 應(yīng)用軟件的時(shí)候經(jīng)常會(huì)遇到各種異常這里幫大家整理了一部分,并解釋如何解決,需要的朋友可以參考下
    2016-10-10
  • Java利用反射實(shí)現(xiàn)文件的讀取操作

    Java利用反射實(shí)現(xiàn)文件的讀取操作

    這篇文章主要介紹了Java利用反射實(shí)現(xiàn)文件的讀取操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評(píng)論

乐山市| 若尔盖县| 西安市| 天门市| 佛教| 南皮县| 都昌县| 修文县| 林州市| 陕西省| 平顶山市| 西吉县| 澄城县| 嘉鱼县| 临潭县| 七台河市| 乌兰察布市| 封丘县| 江油市| 福贡县| 湟源县| 乌鲁木齐市| 长子县| 蓝田县| 汾西县| 乡城县| 吴江市| 安丘市| 龙里县| 虎林市| 望都县| 大兴区| 芒康县| 余庆县| 利津县| 思南县| 恩施市| 乌拉特中旗| 新化县| 东兴市| 德兴市|