springmvc校驗器

1 導(dǎo)入必要依賴(默認(rèn)已經(jīng)導(dǎo)入springmvc的相關(guān)依賴)

    <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
    <!--hibernate校驗器饶深,與hibernate的數(shù)據(jù)獲取無關(guān)-->
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.1.2.Final</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
    <dependency>
      <groupId>org.jboss.logging</groupId>
      <artifactId>jboss-logging</artifactId>
      <version>3.4.1.Final</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>2.0.1.Final</version>
    </dependency>

2 配置校驗器bean于錯誤提示文件

配置bean

    <!-- 校驗器 -->
    <bean id="validator"
          class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- 校驗器類 -->
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
        <!-- 指定校驗使用的資源文件,如果不指定則默認(rèn)使用classpath下的ValidationMessages.properties -->
        <property name="validationMessageSource" ref="messageSource" />
    </bean>

    <!-- 校驗錯誤信息配置文件,使用ReloadableResourceBundleMessageSource加載配置文件 -->
    <bean id="messageSource"
          class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>classpath:ValidationMessages</value>
            </list>
        </property>
        <!-- 資源文件編碼格式   -->
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 對資源文件內(nèi)容緩存時間,單位秒 -->
        <property name="cacheSeconds" value="120" />
    </bean>

在錯誤文件ValidationMessages.properties文件中編寫錯誤提示信息

user.name.length=用戶名長度必須在6到9之間
user.name.notNull=用戶名不能為空

在需要校驗的實體類中使用注解指定校驗方式于提示信息

package com.dahuici.zyb.entity;

import lombok.Data;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
public class User {
    //非空校驗
    @NotNull(message = "{user.name.notNull}")
    //字符串長度校驗
    @Size(min = 6,max = 9,message = "{user.name.length}")
    private String name;

    private Integer age;

    public User(){

    }

    public User(String name,Integer age){
        this.name = name;
        this.age = age;
    }

}

3 將校驗器注入適配器

這里的適配器是RequestMappingHandlerAdapter裹纳,查看源碼會發(fā)現(xiàn)該類沒有校驗器對應(yīng)的屬性,其實該校驗器是注入進(jìn)了適配器的WebBindingInitializer屬性的validator屬性里面睬辐。所以還有一種租入適配器的方式是通過WebBindingInitializer屬性注入栖茉,具體注入的WebBindingInitializer實際是其實現(xiàn)類ConfigurableWebBindingInitializer的實例對象。

<!--自己配置映射器與適配器并注入校驗器-->
    <mvc:annotation-driven validator="validator">
        <!--配置返回值轉(zhuǎn)換器-->
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="defaultCharset" value="utf-8"></property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

4 驗證

在controller里面用@Validated表示該實體需要驗證纹份,然后用BindingResult對象接受驗證結(jié)果,當(dāng)驗證不通過時BindingResult就會接受對應(yīng)的錯誤提示信息廷痘。

    @GetMapping("/test.do")
    public String helloword(@Validated User user,BindingResult bindingResult)
    throws IOException 
    {
        StringBuffer stringBuffer = new StringBuffer();
        if (bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach(e -> stringBuffer.append(e.getDefaultMessage()));
            return stringBuffer.toString();
        }

        return "驗證成功";

    }

@Validated與@Valid區(qū)別

1 @Validated可以分組驗證蔓涧,@Valid不能

對于實體,同一個屬性對于不同的操作有不同的驗證規(guī)則(例如插入與更新)笋额,這時就需要對屬性的驗證進(jìn)行分組元暴。
實體:

    @NotNull(message = "id不能為空",groups = {Update.class})
    private String id;

controller:

    @PutMapping("/idtuConstructionProcess")
    public ResponseEntity update(@RequestBody @Validated({Update.class}) IdtuConstructionProcess idtuConstructionProcess) {
        boolean result = idtuConstructionProcessService.updateById(idtuConstructionProcess);
        return new ResponseEntity(result ? ResponseEntity.SUCCESS : ResponseEntity.SERVER_ERROR, result ? "success" : "failed");
    }

2 注解地方

@Validated:可以用在類、方法和方法參數(shù)上兄猩。但是不能用在成員屬性(字段)上
@Valid:可以用在方法茉盏、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(字段)上

由于@Valid可以使用在屬性上枢冤,因此@Validated可以結(jié)合@Valid實現(xiàn)嵌套驗證

3 嵌套驗證

當(dāng)一個實體的屬性是另一個實體鸠姨,例如用戶實體(User)擁有一輛車(Car),希望在驗證User時也對Car屬性進(jìn)行驗證,那么就必須在Car屬性前添加@Valid掏导。添加了@Valid后就能進(jìn)行嵌套驗證享怀。

提示:如果只在controller層使用@Validated注解時,可以直接在參數(shù)前面添加趟咆,類上無需添加@Validated注解添瓷,但是如果要在Controller層使用@NotNull這些注解,那么Controller類上必須添加@Validated注解才能生效值纱。(在springboot上測試的鳞贷,沒有單獨使用springmvc測試該功能)

常用注解

可參考這篇博客:
https://blog.csdn.net/qq_37805065/article/details/102638136

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虐唠,隨后出現(xiàn)的幾起案子搀愧,更是在濱河造成了極大的恐慌,老刑警劉巖疆偿,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咱筛,死亡現(xiàn)場離奇詭異,居然都是意外死亡杆故,警方通過查閱死者的電腦和手機(jī)迅箩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來处铛,“玉大人饲趋,你說我怎么就攤上這事拐揭。” “怎么了奕塑?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵堂污,是天一觀的道長。 經(jīng)常有香客問我龄砰,道長盟猖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任换棚,我火速辦了婚禮扒披,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圃泡。我一直安慰自己,他們只是感情好愿险,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布颇蜡。 她就那樣靜靜地躺著,像睡著了一般辆亏。 火紅的嫁衣襯著肌膚如雪风秤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天扮叨,我揣著相機(jī)與錄音缤弦,去河邊找鬼。 笑死彻磁,一個胖子當(dāng)著我的面吹牛碍沐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衷蜓,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼累提,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了磁浇?” 一聲冷哼從身側(cè)響起斋陪,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎置吓,沒想到半個月后无虚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡衍锚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年友题,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片构拳。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咆爽,死狀恐怖梁棠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斗埂,我是刑警寧澤符糊,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站呛凶,受9級特大地震影響男娄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漾稀,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一模闲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崭捍,春花似錦尸折、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粒梦,卻和暖如春亮航,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匀们。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工缴淋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泄朴。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓重抖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叼旋。 傳聞我的和親對象是個殘疾皇子仇哆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容