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

Spring 校驗(yàn)(validator,JSR-303)簡(jiǎn)單實(shí)現(xiàn)方式

 更新時(shí)間:2021年10月19日 15:11:53   作者:lemontree1993  
這篇文章主要介紹了Spring 校驗(yàn)(validator,JSR-303)簡(jiǎn)單實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring 校驗(yàn)(validator,JSR-303)實(shí)現(xiàn)

什么是JSR-303規(guī)范

JSR 303是Java EE 6中的一項(xiàng)子規(guī)范,叫做Bean Validation,官方參考實(shí)現(xiàn)是hibernate Validator,此實(shí)現(xiàn)與Hibernate ORM沒(méi)有任何關(guān)系。JSR 303用于對(duì)Java Bean中的字段的值進(jìn)行驗(yàn)證。

與Spring MVC結(jié)合

Spring-mvc.xml配置:

    <!--JSR-303-->
    <mvc:annotation-driven validator="validator"/>
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="validatemessage"/>
        <property name="useCodeAsDefaultMessage" value="false"/>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="cacheSeconds" value="60"/>
    </bean>
    <bean  id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
        <property name="conversionService">
            <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
        </property>
        <property name="validator" ref="validator"/>
    </bean>

實(shí)體類添加驗(yàn)證注解

這里貼出部分代碼,知道如何加注解即可:

import com.lemontree.common.utils.AjaxResult;
import com.lemontree.common.utils.StringUtil;
import com.lemontree.common.utils.email.EmailUtils;
import org.hibernate.validator.constraints.NotEmpty;
import java.util.Date;
public class User {
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.id
     *
     * @mbg.generated Thu Mar 16 13:27:38 CST 2017
     */
    private Integer id;
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.user_name
     *
     * @mbg.generated Thu Mar 16 13:27:38 CST 2017
     */
    @NotEmpty(message = "用戶名不能為空")
    private String userName;
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.password
     *
     * @mbg.generated Thu Mar 16 13:27:38 CST 2017
     */
    @NotEmpty(message = "密碼不能為空")
    private String password;
    }

控制器驗(yàn)證注解添加

將@Validated 注解跟在實(shí)體類前面,BindingResult緊跟其后:

    @RequestMapping(value = "/login.htm", method = RequestMethod.POST)
    public @ResponseBody AjaxResult login(@Validated User user, BindingResult bindingResult,
                                          HttpServletRequest request, HttpServletResponse response) {
        if (bindingResult.hasErrors()){
            List<FieldError> errorses = bindingResult.getFieldErrors();
            if (CollectionUtils.isNotEmpty(errorses)){
                errorses.forEach(item->{
                    System.out.println(item.getDefaultMessage());
                });
            }
        }
      }

Java Hibernate Validator JSR-303驗(yàn)證

JSR-303是JAVA EE 6中的一項(xiàng)子規(guī)范,叫做 Bean Validation,Hibernate Validator是Bean Validation 的參考實(shí)現(xiàn)。

實(shí)際使用就是通過(guò)注解來(lái)給字段添加約束,然后校驗(yàn)字段是否符合規(guī)范,如果不符合就會(huì)拋出異常,以此來(lái)減少校驗(yàn)數(shù)據(jù)的代碼,并保證拿到的數(shù)據(jù)都是符合規(guī)范的,也可以和Spring框架配合使用

集成

官方文檔

https://mvnrepository.com/artifact/org.hibernate/hibernate-validator

https://mvnrepository.com/artifact/javax.validation/validation-api

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.el</artifactId>
            <version>3.0.1-b09</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

使用

校驗(yàn)對(duì)象

public class JsrTest {
    @NotNull(message = "id不能為空!")
    @Min(value = 1, message = "Id只能大于等于1")
    Integer id;
    @NotNull(message = "姓名不能為空!")
    String name;
    public void validateParams() {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();//獲取一個(gè)驗(yàn)證器
        Set<ConstraintViolation<JsrTest>> violationSet = validator.validate(this);//驗(yàn)證數(shù)據(jù),獲取到錯(cuò)誤集合
        Iterator<ConstraintViolation<JsrTest>> iterator = violationSet.iterator();
        if (iterator.hasNext()) {
            String errorMessage = iterator.next().getMessage();//獲取到錯(cuò)誤信息
            throw new ValidationException(errorMessage);
        }
    }
    public static void main(String args[]) {
        JsrTest req = new JsrTest();
        req.id = 1;
        req.validateParams();
    }
}

像上面那樣將在屬性上添加注解即可聲明約束

校驗(yàn)屬性

上面是校驗(yàn)整個(gè)對(duì)象,也可以單獨(dú)校驗(yàn)?zāi)硞€(gè)字段:

validator.validateProperty(object, "name");

分組校驗(yàn)

public class JsrTest {
    @NotNull(message = "id不能為空!", groups = {ValidationGroup.class})
    @Min(value = 1, message = "Id只能大于等于1")
    Integer id;
    @NotNull(message = "姓名不能為空!", groups = {ValidationGroup.class})
    String name;
    @DecimalMin(value = "1.1")
    double price;
    int date;
    public static void validateParams(JsrTest jsrTest) {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<JsrTest>> violationSet = validator.validate(jsrTest, ValidationGroup.class);
        Iterator<ConstraintViolation<JsrTest>> iterator = violationSet.iterator();
        if (iterator.hasNext()) {
            String errorMessage = iterator.next().getMessage();
            throw new ValidationException(errorMessage);
        }
    }
    public static void main(String args[]) {
        JsrTest req = new JsrTest();
        validateParams(req);
    }    
    public interface ValidationGroup {
    }
}

分組校驗(yàn)所指定的calss必須是一個(gè)接口,可以指定多個(gè)

自定義約束

通常情況下,框架提供的注解已經(jīng)可以滿足正常的驗(yàn)證需求,但是我們也可以自定義注解來(lái)滿足我們的需求

我們這里的例子是所注釋的字符串中不能包含指定字符

@Target(FIELD)      //元注解,定義該注解使用在字段上
@Retention(RUNTIME) //定義注解的生命周期
@Constraint(validatedBy = CustomValidator.class)//指明該注解的校驗(yàn)器
@Documented         //表示該注解會(huì)被添加到JavaDoc中
public @interface CustomConstraints {
    String message() default "默認(rèn)異常message";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {}; //這個(gè)屬性可以用來(lái)標(biāo)注錯(cuò)誤的嚴(yán)重等級(jí),但是并不被API自身所使用
    String value() default " ";
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 * 需要實(shí)現(xiàn)ConstraintValidator接口
 * 泛型的第一個(gè)參數(shù)是自定義的注解,第二個(gè)參數(shù)注解所注釋的字段的類型
 */
public class CustomValidator implements ConstraintValidator<CustomConstraints, String> {
    private String value;
    /**
     * 初始化調(diào)用,拿到注解所指定的value
     *
     * @param constraintAnnotation
     */
    @Override
    public void initialize(CustomConstraints constraintAnnotation) {
        value = constraintAnnotation.value();
    }
    /**
     * @param value   注釋的字段的值
     * @param context
     * @return true 通過(guò)驗(yàn)證,false 未通過(guò)驗(yàn)證
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value != null && value.contains(this.value)) {
            context.disableDefaultConstraintViolation();//禁用默認(rèn)的消息
            context.buildConstraintViolationWithTemplate("新添加的錯(cuò)誤消息").addConstraintViolation();
            return false;
        }
        return true;
    }
}

然后就可以和其他注解一樣使用它了

封裝

或者是將驗(yàn)證參數(shù)的代碼提取去出來(lái),單獨(dú)寫一個(gè)方法

    public static void validateParams(Object object) {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();//獲取一個(gè)驗(yàn)證器
        Set<ConstraintViolation<Object>> violationSet = validator.validate(object);//驗(yàn)證數(shù)據(jù),獲取到錯(cuò)誤集合
        Iterator<ConstraintViolation<Object>> iterator = violationSet.iterator();
        if (iterator.hasNext()) {
            String errorMessage = iterator.next().getMessage();//獲取到錯(cuò)誤信息
            throw new ValidationException(errorMessage);
        }
    }

當(dāng)然這里也可以不拋出異常,而返回一個(gè)boolean值,如何封裝看實(shí)際需求

配合Spring使用

    @GetMapping("/test")
    public Integer lookCanBuyGoods(@Valid JsrTest req, BindingResult result) throws Exception {
        if (result.hasErrors()) {
            throw new ValidationException(result.getAllErrors().get(0).getDefaultMessage());
        }
        //do something...
        return 1;
    }

@Valid添加這個(gè)注解之后就會(huì)對(duì)參數(shù)進(jìn)行驗(yàn)證,如果在其后沒(méi)有跟BindingResult,驗(yàn)證不通過(guò)就會(huì)直接拋出異常,如果添加了BindingResult參數(shù),就不會(huì)直接拋出異常,而會(huì)把異常信息存儲(chǔ)在BindingResult中,供開(kāi)發(fā)者自行處理

如果想要使用分組可以這樣

    @GetMapping("/test")
    public Integer test(@Validated (JsrTest.ValidationGroup.class) JsrTest req, BindingResult result) throws Exception {
        if (result.hasErrors()) {
            throw new ValidationException(result.getAllErrors().get(0).getDefaultMessage());
        }
        //do something...
        return 1;
    }

@Validated如果不使用分組其作用和@Valid一致

注解使用說(shuō)明

Constraint 詳細(xì)信息
@Null 被注釋的元素必須為 null
@NotNull 被注釋的元素必須不為 null
@AssertTrue 被注釋的元素必須為 true
@AssertFalse 被注釋的元素必須為 false
@Min(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
@Max(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
@DecimalMin(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
@Size(max, min) 被注釋的元素的大小必須在指定的范圍內(nèi)
@Digits (integer, fraction) 被注釋的元素必須是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi)
@Past 被注釋的元素必須是一個(gè)過(guò)去的日期
@PastOrPresent 被注釋的元素必須是過(guò)去或現(xiàn)在的日期
@Future 被注釋的元素必須是一個(gè)將來(lái)的日期
@FutureOrPresent 被注釋的元素必須是將來(lái)或現(xiàn)在的日期
@Pattern(value) 被注釋的元素必須符合指定的正則表達(dá)式
@Digits(integer =, fraction =) 驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度
@Email 驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證,算通過(guò)驗(yàn)證
@NotBlank 字符串不能是Null還有被Trim的長(zhǎng)度要大于0
@NotEmpty 不能為null,且長(zhǎng)度大于0
@Negative 被注釋的元素必須是負(fù)數(shù)
@NegativeOrZero 被注釋的元素必須是負(fù)數(shù)或0
@Positive 必須是正數(shù)
@PositiveOrZero 必須是正數(shù)或0

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Cloud實(shí)現(xiàn)提供API給客戶端的方法詳解

    Spring Cloud實(shí)現(xiàn)提供API給客戶端的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring Cloud實(shí)現(xiàn)提供API給客戶端的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決

    IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決

    這篇文章主要介紹了IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解

    StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解

    這篇文章主要介紹了StringUtils中的isEmpty、isNotEmpty、isBlank和isNotBlank的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot讀取配置的6種方式

    SpringBoot讀取配置的6種方式

    本文主要介紹了SpringBoot讀取配置的6種方式,主要包括使用默認(rèn)配置、使用application.properties文件、使用application.yml文件、使用@Value注解、使用Environment對(duì)象和使用ConfigurableEnvironment對(duì)象,感興趣的可以了解一下
    2023-08-08
  • 深度剖析Java中的內(nèi)存原型及工作原理

    深度剖析Java中的內(nèi)存原型及工作原理

    這篇文章主要介紹了深度剖析Java中的內(nèi)存原型及工作原理,本文講解了java虛擬機(jī)內(nèi)存原型、常量池、Java內(nèi)存分配中的棧、Java內(nèi)存分配中的堆等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Java線程的start方法回調(diào)run方法的操作技巧

    Java線程的start方法回調(diào)run方法的操作技巧

    面試過(guò)程中經(jīng)常會(huì)被面試官問(wèn)到為什么我們調(diào)用start()方法時(shí)會(huì)執(zhí)行run()方法,為什么不能直接調(diào)用run()方法,問(wèn)的一頭霧水,今天小編給大家介紹下Java線程的start方法回調(diào)run方法的操作技巧,需要的朋友參考下吧
    2017-11-11
  • 淺談Java中Lock和Synchronized的區(qū)別

    淺談Java中Lock和Synchronized的區(qū)別

    這篇文章主要介紹了Java中Lock和Synchronized的區(qū)別,Lock和Synchronized都是java中去用來(lái)解決線程安全問(wèn)題的一個(gè)工具,但是具體有什么區(qū)別呢?下面我們一起進(jìn)入文章了解具體詳細(xì)內(nèi)容吧,需要的朋友可以參考一下
    2022-04-04
  • IDEA2022創(chuàng)建SpringBoot項(xiàng)目的圖文教程

    IDEA2022創(chuàng)建SpringBoot項(xiàng)目的圖文教程

    本文主要介紹了IDEA2022創(chuàng)建SpringBoot項(xiàng)目的圖文教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Java中Math.round()的用法及說(shuō)明

    Java中Math.round()的用法及說(shuō)明

    這篇文章主要介紹了Java中Math.round()的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 解析Java中的默認(rèn)方法

    解析Java中的默認(rèn)方法

    這篇文章主要介紹了Java中的默認(rèn)方法,包括繼承和調(diào)用等Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-07-07

最新評(píng)論

河北区| 南华县| 铜梁县| 海淀区| 元江| 蒙阴县| 广南县| 虞城县| 聊城市| 阳泉市| 南乐县| 丰原市| 沅江市| 洛南县| 新沂市| 灵川县| 闻喜县| 溆浦县| 罗平县| 阿鲁科尔沁旗| 茂名市| 延边| 太康县| 习水县| 伽师县| 通海县| 东莞市| 兴安县| 资讯 | 江源县| 通榆县| 葵青区| 旬阳县| 洪雅县| 会昌县| 新竹县| 稷山县| 绥化市| 拉萨市| 夹江县| 阳泉市|