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

hibernate-validator后端表單數(shù)據(jù)校驗的使用示例詳解

 更新時間:2022年08月29日 15:37:43   作者:小鐘要學(xué)習(xí)??!  
這篇文章主要介紹了hibernate-validator后端表單數(shù)據(jù)校驗的使用,hibernate-validator提供的校驗方式為在類的屬性上加入相應(yīng)的注解來達(dá)到校驗的目的,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

hibernate-validator后端表單數(shù)據(jù)校驗的使用

1、hibernate-validator介紹

早期的網(wǎng)站,用戶輸入一個郵箱地址,需要將郵箱地址發(fā)送到服務(wù)端,服務(wù)端進(jìn)行校驗,校驗成功后,給前端一個響應(yīng)。

有了JavaScript后,校驗工作可以放在前端去執(zhí)行。那么為什么還需要服務(wù)端校驗?zāi)兀?因為前端傳來的數(shù)據(jù)不可信。前端很容易獲取到后端的接口,如果有人直接調(diào)用接口,就可能會出現(xiàn)非法數(shù)據(jù),所以服務(wù)端也要數(shù)據(jù)校驗。

總的來說:

  • 前端校驗:主要是提高用戶體驗
  • 后端校驗:主要是保證數(shù)據(jù)安全可靠

校驗參數(shù)基本上是一個體力活,而且冗余代碼繁多,也影響代碼的可讀性,我們需要一個比較優(yōu)雅的方式來解決這個問題。Hibernate Validator 框架剛好解決了這個問題,可以以很優(yōu)雅的方式實現(xiàn)參數(shù)的校驗,讓業(yè)務(wù)代碼和校驗邏輯分開,不再編寫重復(fù)的校驗邏輯。

hibernate-validator優(yōu)勢:

  • 驗證邏輯與業(yè)務(wù)邏輯之間進(jìn)行了分離,降低了程序耦合度
  • 統(tǒng)一且規(guī)范的驗證方式,無需你再次編寫重復(fù)的驗證代碼
  • 你將更專注于你的業(yè)務(wù),將這些繁瑣的事情統(tǒng)統(tǒng)丟在一邊

hibernate-validator的maven坐標(biāo):

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.18.Final</version>
</dependency>

提示:spring-boot-starter-web中已經(jīng)依賴了hibernate-validator

2、hibernate-validator常用注解

hibernate-validator提供的校驗方式為在類的屬性上加入相應(yīng)的注解來達(dá)到校驗的目的。hibernate-validator提供的用于校驗的注解如下:

注解說明
@AssertTrue用于boolean字段,該字段只能為true
@AssertFalse用于boolean字段,該字段只能為false
@CreditCardNumber對信用卡號進(jìn)行一個大致的驗證
@DecimalMax只能小于或等于該值
@DecimalMin只能大于或等于該值
@Email檢查是否是一個有效的email地址
@Future檢查該字段的日期是否是屬于將來的日期
@Length(min=,max=)檢查所屬的字段的長度是否在min和max之間,只能用于字符串
@Max該字段的值只能小于或等于該值
@Min該字段的值只能大于或等于該值
@NotNull不能為null
@NotBlank不能為空,檢查時會將空格忽略
@NotEmpty不能為空,這里的空是指空字符串
@Pattern(regex=)被注釋的元素必須符合指定的正則表達(dá)式
@URL(protocol=,host,port)檢查是否是一個有效的URL,如果提供了protocol,host等,則該URL還需滿足提供的條件

3、 hibernate-validator入門案例

3.1、第一步:創(chuàng)建maven工程hibernate-validator_demo并配置pom.xml文件

spring-boot-starter-web中已經(jīng)依賴了hibernate-validator

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>org.example</groupId>
    <artifactId>hibernate-validator_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--spring-boot-starter-web中已經(jīng)依賴了hibernate-validator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--
		<dependency>
              <groupId>org.hibernate</groupId>
              <artifactId>hibernate-validator</artifactId>
              <version>6.0.18.Final</version>
        </dependency>
		-->
    </dependencies>

</project>

3.2、創(chuàng)建實體類

NotEmpty:不能為空字符串

package com.zcl.entity;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
/**
 * 項目名稱:hibernate-validator_demo
 * 描述:用戶實體類
 *
 * @author zhong
 * @date 2022-08-29 12:48
 */
@Data
public class User {
    @NotNull(message = "用戶id不能為空")
    private Integer id;

    @NotEmpty(message = "用戶名不能為空")
    @Length(max = 50, message = "用戶名長度不能超過50")
    private String username;

    @Max(value = 80,message = "年齡最大為80")
    @Min(value = 18,message = "年齡最小為18")
    private int age;

    @Pattern(regexp = "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$",
            message = "郵箱格式不正確")
    private String email;
}

3.3、創(chuàng)建UserController

package com.zcl.controller;

import com.zcl.entity.User;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.NotBlank;

/**
 * 項目名稱:hibernate-validator_demo
 * 描述:用戶控制器
 *
 * @author zhong
 * @date 2022-08-29 12:53
 */
@RestController
@RequestMapping("/user")
@Validated
public class UserController {
    /**
     * 簡單數(shù)據(jù)類型校驗
     * @param id
     * @return
     */
    @RequestMapping("/delete")
    public String delete(@NotBlank(message = "id不能為空") String id){
        System.out.println("delete..." + id);
        return "OK";
    }

    /**
     * 對象屬性校驗
     * @param user
     * @return
     */
    @RequestMapping("/save")
    public String save(@RequestBody @Validated User user){
        System.out.println("save..." + user);
        return "OK";
    }
}

3.4、創(chuàng)建項目啟動類

package com.zcl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 項目名稱:hibernate-validator_demo
 * 描述:項目啟動類
 *
 * @author zhong
 * @date 2022-08-29 13:04
 */
@SpringBootApplication
public class HibernateValidatorApp {
    public static void main(String[] args) {
        SpringApplication.run(HibernateValidatorApp.class, args);
    }
}

3.5、創(chuàng)建application.yml配置文件

該配置文件可有可無

server:
  port: 8080

4、啟動項目測試

使用測試工具或插件進(jìn)行訪問:http://localhost:8080/user/delete

4.1、刪除控制器沒有攜帶數(shù)據(jù)

當(dāng)id為空的時候會直接報錯響應(yīng)到前端頁面

4.2、刪除控制器攜帶id時

4.2、訪問對象屬性校驗不攜帶數(shù)據(jù)時

提示有三個報錯信息

IDEA控制臺查看

4.3、訪問對象屬性校驗攜帶數(shù)據(jù)時

5、處理異常信息

config包下創(chuàng)建全局的異常處理器,全局捕獲@RestController@Controller的注解控制器

package com.zcl.config;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Set;

/**
 * 項目名稱:hibernate-validator_demo
 * 描述:全局的異常處理
 *
 * @author zhong
 * @date 2022-08-29 13:17
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
public class ExceptionConfiguration {
    // 定義只捕獲著兩種異常
    @ExceptionHandler({ConstraintViolationException.class, BindException.class})
    public String validateException(Exception ex, HttpServletRequest request) {
        ex.printStackTrace();
        String msg = null;
        if(ex instanceof ConstraintViolationException){
            // 異常信息強(qiáng)轉(zhuǎn)
            ConstraintViolationException constraintViolationException =
                    (ConstraintViolationException)ex;
            // 獲取異常信息
            Set<ConstraintViolation<?>> violations =
                    constraintViolationException.getConstraintViolations();
            ConstraintViolation<?> next = violations.iterator().next();
            msg = next.getMessage();
        }else if(ex instanceof BindException){
            BindException bindException = (BindException)ex;
            msg = bindException.getBindingResult().getFieldError().getDefaultMessage();
        }
        return msg;
    }
}

6、重新啟動項目測試

注意:當(dāng)我們的請求【http://localhost:8080/user/save?id=1】控制器的時候,不是使用get請求或者路徑的方式提交參數(shù),后端的全局?jǐn)r截代碼是捕獲不到異常信息的,返回的還是之前的直接錯誤顯示在前端的瀏覽器上。通過get請求以及路徑參數(shù)的方式提交就可以了

7、修改代碼,一次校驗不通過就不再執(zhí)行

創(chuàng)建ValidatorConfiguration類,指定校驗時使用快速失敗返回模式

package com.zcl.config;

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 * 項目名稱:hibernate-validator_demo
 * 描述:指定校驗時使用快速失敗返回模式
 *
 * @author zhong
 * @date 2022-08-29 13:38
 */
public class ValidatorConfiguration {
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory =
                Validation.byProvider(HibernateValidator.class)
                        .configure()
                        //快速失敗返回模式
                        .addProperty("hibernate.validator.fail_fast", "true")
                        .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    /**
     * 開啟快速返回
     * 如果參數(shù)校驗有異常,直接拋異常,不會進(jìn)入到 controller,使用全局異常攔截進(jìn)行攔截
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor =
                new MethodValidationPostProcessor();
        /**設(shè)置validator模式為快速失敗返回*/
        postProcessor.setValidator(validator());
        return postProcessor;
    }
}

注意:上面創(chuàng)建的類并不是配置類,所以到目前為止快速失敗返回模式并不會生效,為了使其生效需要創(chuàng)建一個注解用于控制此模式的開啟

8、創(chuàng)建注解EnableFormValidator用于控制快速失敗返回模式的開啟

package com.zcl.config;

import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 項目名稱:hibernate-validator_demo
 * 描述:在啟動類上添加該注解來啟動表單驗證功能---快速失敗返回模式
 *
 * @author zhong
 * @date 2022-08-29 13:41
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ValidatorConfiguration.class)
public @interface EnableFormValidator {
}

在啟動類上加上上面的注解

package com.zcl;

import com.zcl.config.EnableFormValidator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 項目名稱:hibernate-validator_demo
 * 描述:項目啟動類
 *
 * @author zhong
 * @date 2022-08-29 13:04
 */
@SpringBootApplication
@EnableFormValidator
public class HibernateValidatorApp {
    public static void main(String[] args) {
        SpringApplication.run(HibernateValidatorApp.class, args);
    }
}

再次啟動項目的時候通過測試對象屬性,少傳遞兩個參數(shù)集合看出效果,當(dāng)前面的驗證不通過的時候后面的就不會再次驗證了

到此這篇關(guān)于hibernate-validator后端表單數(shù)據(jù)校驗的使用的文章就介紹到這了,更多相關(guān)hibernate-validator數(shù)據(jù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 源碼解讀Spring-Integration執(zhí)行過程

    源碼解讀Spring-Integration執(zhí)行過程

    Spring-Integration基于Spring,在應(yīng)用程序中啟用了輕量級消息傳遞,并支持通過聲明式適配器與外部系統(tǒng)集成,今天主要是看個簡單的hello word進(jìn)來分析下整個執(zhí)行過程,感興趣的朋友一起看看吧
    2021-06-06
  • springmvc項目使用@Valid+BindingResult遇到的問題

    springmvc項目使用@Valid+BindingResult遇到的問題

    這篇文章主要介紹了springmvc項目使用@Valid+BindingResult遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java多線程編程之為什么要進(jìn)行數(shù)據(jù)同步

    java多線程編程之為什么要進(jìn)行數(shù)據(jù)同步

    數(shù)據(jù)同步就是指在同一時間,只能由一個線程來訪問被同步的類變量,當(dāng)前線程訪問完這些變量后,其他線程才能繼續(xù)訪問,下面看一下為什么要進(jìn)行數(shù)據(jù)同步
    2014-01-01
  • Java源碼解析TreeMap簡介

    Java源碼解析TreeMap簡介

    今天小編就為大家分享一篇關(guān)于Java源碼解析TreeMap簡介,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • SpringMVC框架實現(xiàn)Handler處理器的三種寫法

    SpringMVC框架實現(xiàn)Handler處理器的三種寫法

    這篇文章主要介紹了SpringMVC框架實現(xiàn)Handler處理器的三種寫法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址

    Java實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址

    這篇文章主要介紹了如何利用Java語言實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定的參考價值,快跟隨小編一起學(xué)習(xí)一下吧
    2022-06-06
  • Java實現(xiàn)一致性Hash算法詳情

    Java實現(xiàn)一致性Hash算法詳情

    這篇文章主要介紹了Java實現(xiàn)一致性Hash算法詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 解讀maven項目的打包方式

    解讀maven項目的打包方式

    這篇文章主要介紹了關(guān)于maven項目的打包方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java探索之Hibernate主鍵生成策略詳細(xì)介紹

    Java探索之Hibernate主鍵生成策略詳細(xì)介紹

    這篇文章主要介紹了Java探索之Hibernate主鍵生成策略詳細(xì)介紹,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • 淺談Java安全之C3P0的使用

    淺談Java安全之C3P0的使用

    本文主要介紹了淺談Java安全之C3P0的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

体育| 博爱县| 江油市| 洪江市| 荃湾区| 花莲市| 花莲县| 思南县| 孝感市| 东阳市| 临泉县| 高邮市| 奈曼旗| 蒲城县| 安陆市| 乌拉特中旗| 琼结县| 邵东县| 通化市| 静宁县| 信阳市| 乳山市| 松阳县| 板桥市| 巴东县| 东丽区| 伊川县| 神农架林区| 上饶县| 合作市| 永修县| 宣化县| 武冈市| 酉阳| 分宜县| 黄陵县| 盘山县| 营山县| 苏尼特左旗| 洪江市| 鲁甸县|