參數(shù)校驗之validator工具類封裝

為什么要使用Bean Validation宏所?

當(dāng)我們實現(xiàn)某個接口時千扔,都需要對入?yún)?shù)進(jìn)行校驗.

什么是bean validator?

bean validator是一個配置注解來驗證參數(shù)的框架梭姓,它包含兩部分Bean Validator api和Hibernate Validator.

  • Bean Validation API是Java定義的一個驗證參數(shù)的規(guī)范零抬。
  • Hibernate Validator是Bean Validation API的一個實現(xiàn)除师。

pom中引入validator相關(guān)依賴

    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>2.0.1.Final</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.3.6.Final</version>
    </dependency>

工具類開發(fā)

package com.permission.util;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.*;

/**
 * @version:1.0.0
 * @author: lironghong
 * @date: 2019/4/16 23:17
 * @description: validator工具類
 */

public class BeanValidator {
    //校驗工廠
    private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

    /*
     * java使用省略號代替多參數(shù)(參數(shù)類型... 參數(shù)名稱)
     * */
    private static <T> Map<String, String> validate(T t, Class... groups) {
        Validator validator = validatorFactory.getValidator();
        Set<ConstraintViolation<T>> validate = validator.validate(t, groups);
        if (validate.isEmpty()) {
            return Collections.emptyMap();
        } else {
            /*
            * <dependency>
              <groupId>com.google.guava</groupId>
              <artifactId>guava</artifactId>
              <version>18.0</version>
              </dependency>
            * */
            LinkedHashMap errors = Maps.newLinkedHashMap();
            Iterator<ConstraintViolation<T>> iterator = validate.iterator();
            while (iterator.hasNext()) {
                ConstraintViolation violation = (ConstraintViolation) iterator.next();
                errors.put(violation.getPropertyPath().toString(), violation.getMessage());
            }
            return errors;
        }
    }

    public static Map<String, String> validatelist(Collection<?> collection) {
        //google工具類
        Preconditions.checkNotNull(collection);
        Iterator<?> iterator = collection.iterator();
        Map errors;
        do{
            if (!iterator.hasNext()){
                return Collections.emptyMap();
            }
            Object next = iterator.next();
            errors=validate(next,new Class[0]);
        }while (errors.isEmpty());
        return errors;
    }

    public static Map<String,String> validateobject(Object first,Object... objects){
        if (objects !=null && objects.length > 0){
            return validatelist(Lists.asList(first,objects));
        }else {
            return validate(first,new Class[0]);
        }
    }

    public static void check(Object param) throws ParamException {
        Map<String, String> map = BeanValidator.validateobject(param);
        /*
        * <!--tools-->
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.2.2</version>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.10</version>
    </dependency>
        * */
        if (MapUtils.isNotEmpty(map)) {
            throw new ParamException(map.toString());
        }
    }
}

vo層

package com.permission.vo;

import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
* @version:1.0.0
* @author: lironghong
* @date: 2019/4/18 16:36
* @description:
*/
@Data
public class TestVo {
    @NotBlank
    private String msg;
    @NotNull
    private Integer id;
    @NotEmpty
    private List<String> str;
}

控制層測試

    @RequestMapping("/validator.json")
    @ResponseBody
    public JsonData validator(TestVo vo){
        log.info("validator");
        try {
            Map<String, String> validateobject = BeanValidator.validateobject(vo);
            if (validateobject != null && validateobject.entrySet().size() > 0){
                for (Map.Entry<String,String> entry:validateobject.entrySet()){
                    log.info("{}->{}",entry.getKey(),entry.getValue());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return JsonData.success("test validator");
    }

運行結(jié)果

image.png

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凝化,一起剝皮案震驚了整個濱河市浙宜,隨后出現(xiàn)的幾起案子官辽,更是在濱河造成了極大的恐慌,老刑警劉巖粟瞬,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同仆,死亡現(xiàn)場離奇詭異,居然都是意外死亡亩钟,警方通過查閱死者的電腦和手機(jī)乓梨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門鳖轰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扶镀,你說我怎么就攤上這事蕴侣。” “怎么了臭觉?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵昆雀,是天一觀的道長。 經(jīng)常有香客問我蝠筑,道長狞膘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任什乙,我火速辦了婚禮挽封,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臣镣。我一直安慰自己辅愿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布忆某。 她就那樣靜靜地躺著点待,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弃舒。 梳的紋絲不亂的頭發(fā)上癞埠,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音聋呢,去河邊找鬼苗踪。 笑死,一個胖子當(dāng)著我的面吹牛坝冕,可吹牛的內(nèi)容都是我干的徒探。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喂窟,長吁一口氣:“原來是場噩夢啊……” “哼测暗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磨澡,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤碗啄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稳摄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稚字,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胆描。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘫想。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖昌讲,靈堂內(nèi)的尸體忽然破棺而出国夜,到底是詐尸還是另有隱情,我是刑警寧澤短绸,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布车吹,位于F島的核電站,受9級特大地震影響醋闭,放射性物質(zhì)發(fā)生泄漏窄驹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一证逻、第九天 我趴在偏房一處隱蔽的房頂上張望乐埠。 院中可真熱鬧,春花似錦瑟曲、人聲如沸饮戳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至负拟,卻和暖如春烦衣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掩浙。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工花吟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厨姚。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓衅澈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谬墙。 傳聞我的和親對象是個殘疾皇子今布,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

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