springMVC的參數檢驗


先說應用場景,比如說前台傳來一個參數,我們肯定得在后台判斷一下,比如id不能為空了,電話號碼不能少於11位了等等。如果在service層一個一個判斷豈不是要累死個人。代碼也不簡潔,這時候我們肯定會想到用注解啊。javax包提供了參數驗證的功能。足夠滿足我們的需要。在對象上加上注解還沒有完,還有驗證,比如說我給對象加上注解了,我們沒有驗證還是沒一點用,驗證方法肯定是我們自己定義了,如果報錯,我們這邊寫一個方法獲取這些報錯信息要么寫入日志,要么返回前端。

首先我們需要這些類的依賴

<!-- 注解validator -->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>1.1.0.Final</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.2.4.Final</version>
    </dependency>

    <!--工具包 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>
View Code

 

寫一個驗證的工具類(這個工具類可以直接拿起來用,不用管他里面是如何實現的)

 

package com.mmall.util;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.mmall.exception.ParamException;
import org.apache.commons.collections.MapUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class BeanValidator {

    private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

    //檢查一個object對象
    public static <T> Map<String, String> validate(T t, Class... groups) {
        Validator validator = validatorFactory.getValidator();
        Set validateResult = validator.validate(t, groups);
        if (validateResult.isEmpty()) {
            return Collections.emptyMap();
        } else {
            LinkedHashMap errors = Maps.newLinkedHashMap();
            Iterator iterator = validateResult.iterator();
            while (iterator.hasNext()) {
                ConstraintViolation violation = (ConstraintViolation)iterator.next();
                errors.put(violation.getPropertyPath().toString(), violation.getMessage());
            }
            return errors;
        }
    }
    //檢查一個list對象
    public static Map<String, String> validateList(Collection<?> collection) {
        Preconditions.checkNotNull(collection);
        Iterator iterator = collection.iterator();
        Map errors;

        do {
            if (!iterator.hasNext()) {
                return Collections.emptyMap();
            }
            Object object = iterator.next();
            errors = validate(object, new Class[0]);
        } while (errors.isEmpty());

        return errors;
    }
    //用一個方法來封裝上面的兩個方法。我們可以選擇用這個方法,然后到map,把map的錯誤信息記錄到日志,再拋異常
    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);
        if (MapUtils.isNotEmpty(map)) {
            throw new ParamException(map.toString());
        }
    }
}
View Code

 

解釋一下上面的方法,就是說controller調用上面工具類的兩個方法。一個是返回map,一個是直接拋異常。map里面是包含的錯誤信息。因為注解里面帶的用錯誤信息。然后我們的全局捕獲異常類會捕獲到里面的信息。搞不清也沒關系。工具類而已。拿起來就用,一頓粘貼復制。美滋滋~~~

 

寫個實體類

 

package com.mmall.model;

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

import javax.validation.constraints.NotNull;

/**
 * Created by 敲代碼的卡卡羅特
 * on 2018/3/24 23:59.
 */
@Data
public class TestVo {
    @NotNull
    private Integer id;
    @NotBlank
    private String name;

    public TestVo(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
}
View Code

 

 

然后controller層測試下

 @RequestMapping("test.json")
    public ModelAndView ss(){
        BeanValidator.check(new TestVo(null,null));
        HashMap map = new HashMap();
        map.put("name","lzh");
        map.put("age",12);
        ModelAndView view=new ModelAndView("jsonView",map);
        return view;
    }
View Code

 

 

會直接拋出異常。當然如果javax提供的異常信息不能滿足你,你也可以自定義。自行百度把。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM