中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot中如何使用Validation進行參數校驗

發布時間:2020-06-05 13:42:11 來源:億速云 閱讀:3417 作者:Leah 欄目:編程語言

SpringBoot中如何使用Validation進行參數校驗?這篇文章運用了實例代碼展示,代碼非常詳細,可供感興趣的小伙伴們參考借鑒,希望對大家有所幫助。

1. pom.xml添加AOP支持

如果已經引用了spring-boot-starter-web,就不要需要引用spring-boot-starter-validation了,本例就不再引用

<!-- 引入validation支持 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 創建接口

分組使用,不分組的話,不需要創建接口,可直接跳過此步

import javax.validation.GroupSequence;

public class ToolInterface {
    // 新增使用(配合spring的@Validated功能分組使用)
    public interface insert{}

    // 更新使用(配合spring的@Validated功能分組使用)
    public interface update{}

    // 屬性必須有這兩個分組的才驗證(配合spring的@Validated功能分組使用)
    @GroupSequence({insert.class, update.class})
    public interface all{};
}

3. 創建實體類

groups 指定分組,可屬于多個組

 import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

import com.qfx.modules.common.util.ToolInterface;

public class UserVo {
    @Min(groups = {ToolInterface.update.class}, value = 1, message = "ID不能小于1")
    private int id;

    @NotBlank(groups = {ToolInterface.update.class, ToolInterface.insert.class}, message = "用戶名不能為空")
    private String name;

    @NotBlank(groups = {ToolInterface.update.class, ToolInterface.insert.class}, message = "密碼不能為空")
    @Size(groups = {ToolInterface.update.class, ToolInterface.insert.class}, min = 6, max = 12, message = "密碼長度不能小于6,大于12")
    private String password;

    @Min(value = 1, message = "年齡必須大于1歲")
    @Max(value = 200, message = "年齡必須小于200歲")
    private int age;

    private String remark;

    // get、set方法略過...,如果使用Lombok則不需要寫get、set方法了,原因你懂的...
}

SpringBoot中如何使用Validation進行參數校驗

4. 創建驗證信息格式化工具類ToolValidated.java

import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

import com.qfx.modules.common.vo.MessageBean;

public class ToolValidated {
    private static final Logger LOG = LoggerFactory.getLogger(ToolValidated.class);

    // 實際使用建議將編碼信息放置在一個單獨的文件中統一管理
    /**
     * 操作成功
     */
    public static int SUCCESS = 200;
    /**
     * 參數無效
     */
    public static int PARAM_INVALID = 1001;

    // =================== Spring validated (建議使用) ===================  
    /**
     * <h6>功能:驗證參數信息是否有效</h6>
     * 
     * @param bindingResult
     * @return 
     */
    public static MessageBean myValidate(BindingResult bindingResult) {
        MessageBean messageBean = new MessageBean();
        if(bindingResult.hasErrors()) {
            // 設置驗證結果狀態碼
            messageBean.setCode(PARAM_INVALID);
            // 獲取錯誤字段信息集合
            List<FieldError> fieldErrorList = bindingResult.getFieldErrors();

            // 使用TreeSet是為了讓輸出的內容有序輸出(默認驗證的順序是隨機的)
            Set<String> errorInfoSet = new TreeSet<String>();
            for (FieldError fieldError : fieldErrorList) {
                // 遍歷錯誤字段信息
                errorInfoSet.add(fieldError.getDefaultMessage());
                LOG.debug("[{}.{}]{}", fieldError.getObjectName() , fieldError.getField(), fieldError.getDefaultMessage());
            }

            StringBuffer sbf = new StringBuffer();
            for (String errorInfo : errorInfoSet) {
                sbf.append(errorInfo);
                sbf.append(",");
            }
            messageBean.setMessage(sbf.substring(0, sbf.length() - 1));
        }

        return messageBean;
    }
}

5. 參數驗證

5.1 手動驗證

5.1.1 創建測試類TestCtl.java
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
import com.qfx.modules.common.util.ToolInterface;
import com.qfx.modules.common.util.ToolValidated;
import com.qfx.modules.common.vo.MessageBean;
import com.qfx.modules.demo.vo.UserVo;

/**
 * <h6>描述:實體類參數校驗示例</h6>
 *  本類示例僅適用于實體類參數校驗,方法參數校驗請參照TestExtCtl.java中的validatedFive方法
 */
@RestController
@RequestMapping("test")
public class TestCtl {

    /**
     * <h6>功能:只驗證未UserVo中設置group的屬性</h6>
     *  只驗證不需要分組的參數,這里只驗證userVo.age
     * @param userVo
     * @param bindingResult
     * @return 
     */
    @RequestMapping("validatedOne")
    public String validatedOne(@Validated() UserVo userVo, BindingResult bindingResult) {
        // 驗證參數信息是否有效
        MessageBean messageBean = ToolValidated.myValidate(bindingResult);
        if (ToolValidated.SUCCESS == messageBean.getCode()) {
            messageBean.setMessage("哈哈哈,通過驗證了");
        }

        return JSONObject.toJSONString(messageBean);
    }

    /**
     * <h6>功能:只驗證UserVo中group為"ToolValidated.insert.class"的屬性</h6>
     *  驗證組為"insert.class"的參數,這里驗證userVo.name、驗證userVo.password
     * @param userVo
     * @param bindingResult
     * @return 
     */
    @RequestMapping("validatedTwo")
    public String validatedTwo(@Validated(ToolInterface.insert.class) UserVo userVo, BindingResult bindingResult) {
        // 驗證參數信息是否有效
        MessageBean messageBean = ToolValidated.myValidate(bindingResult);
        if (ToolValidated.SUCCESS == messageBean.getCode()) {
            messageBean.setMessage("哈哈哈,通過驗證了");
        }

        return JSONObject.toJSONString(messageBean);
    }

    /**
     * <h6>功能:只驗證UserVo中group為"ToolValidated.update.class"的屬性</h6>
     *  驗證組為"update.class"的參數,這里驗證userVo.id、userVo.name、驗證userVo.password
     * @param userVo
     * @param bindingResult
     * @return 
     */
    @RequestMapping("validatedThree")
    public String validatedThree(@Validated(ToolInterface.update.class) UserVo userVo, BindingResult bindingResult) {
        // 驗證參數信息是否有效
        MessageBean messageBean = ToolValidated.myValidate(bindingResult);
        if (ToolValidated.SUCCESS == messageBean.getCode()) {
            messageBean.setMessage("哈哈哈,通過驗證了");
        }

        return JSONObject.toJSONString(messageBean);
    }

    /**
     * <h6>功能:只驗證UserVo中同時滿足多個group的屬性</h6>
     *  驗證組為"all.class"的參數,all接口包含insert.class和 update.class,
     *  因此需要驗證同時屬于insert.class和 update.class的參數,
     *  這里只驗證userVo.name、驗證userVo.password
     * @param userVo
     * @param bindingResult
     * @return 
     */
    @RequestMapping("validatedFour")
    public String validatedFour(@Validated(ToolInterface.all.class) UserVo userVo, BindingResult bindingResult) {
        // 驗證參數信息是否有效
        MessageBean messageBean = ToolValidated.myValidate(bindingResult);
        if (ToolValidated.SUCCESS == messageBean.getCode()) {
            messageBean.setMessage("哈哈哈,通過驗證了");
        }

        return JSONObject.toJSONString(messageBean);
    }
}
5.1.2 測試

SpringBoot中如何使用Validation進行參數校驗

SpringBoot中如何使用Validation進行參數校驗

SpringBoot中如何使用Validation進行參數校驗

SpringBoot中如何使用Validation進行參數校驗

5.2 自動驗證

5.2.1 創建一個全局自動處理類ParamVerifyException.java
import java.util.Set;
import java.util.TreeSet;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import com.alibaba.fastjson.JSONObject;
import com.qfx.modules.common.util.ToolValidated;
import com.qfx.modules.common.vo.MessageBean;

/**
 * <h6>描述:全局參數驗證異常處理</h6>
 * 設定執行順序,只要比全局異常處理類靠前就行,否則會報500或者404錯誤信息
 * 這里的全局異常處理類是MyExceptionHandler.java
 */
@RestControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE - 1)
public class ParamVerifyException {
    private static final Logger LOG = LoggerFactory.getLogger(ParamVerifyException.class);

    /**
     * <h6>功能:處理普通參數校驗失敗的異常</h6>
     * 
     * @param ex ConstraintViolationException
     * @return 
     */
    @ExceptionHandler(value = ConstraintViolationException.class)
    public String ConstraintViolationException(ConstraintViolationException ex) {
        MessageBean messageBean = new MessageBean();
        // 使用TreeSet是為了讓輸出的內容有序輸出(默認驗證的順序是隨機的)
        Set<String> errorInfoSet = new TreeSet<String>();
        Set<ConstraintViolation<?>> violations = ex.getConstraintViolations();
        if (!violations.isEmpty()) {
            // 設置驗證結果狀態碼
            messageBean.setCode(ToolValidated.PARAM_INVALID);
            for (ConstraintViolation<?> item : violations) {
                System.out.println(item.getPropertyPath());
                // 遍歷錯誤字段信息
                errorInfoSet.add(item.getMessage());
                LOG.debug("[{}]{}", item.getPropertyPath(), item.getMessage());
            }

            StringBuffer sbf = new StringBuffer();
            for (String errorInfo : errorInfoSet) {
                sbf.append(errorInfo);
                sbf.append(",");
            }
            messageBean.setMessage(sbf.substring(0, sbf.length() - 1));
        }

        return JSONObject.toJSONString(messageBean);
    }

    /**
     * <h6>功能: 處理實體類參數校驗失敗的異常</h6>
     * 
     * @param ex BindException
     * @return 
     */
    @ExceptionHandler(value = BindException.class)
    public String BindException(BindException bindingResult) {
        // 驗證參數信息是否有效
        MessageBean messageBean = ToolValidated.myValidate(bindingResult);
        return JSONObject.toJSONString(messageBean);
    }
}
5.2.2 創建測試類TestExtCtl.java

這里沒有指定驗證信息處理類,全部由ParamVerifyException.java自動攔截處理

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
import com.qfx.modules.common.util.ToolInterface;
import com.qfx.modules.common.vo.MessageBean;
import com.qfx.modules.demo.vo.UserVo;

/**
 * <h6>描述:實體類參數與普通參數校驗示例</h6>
 *  采用全局異常處理的方式來進行參數校驗
 */
@RestController
@RequestMapping("testExt")
@Validated  // @Validated只能作用在類上面
public class TestExtCtl {

    /**
     * <h6>功能:只驗證未UserVo中設置group的屬性</h6>
     * 
     * @param userVo
     * @return 
     */
    @RequestMapping("validatedOne")
    public String validatedOne(@Validated() UserVo userVo) {
        MessageBean messageBean = new MessageBean("哈哈哈,通過驗證了");

        return JSONObject.toJSONString(messageBean);
    }

    /**
     * <h6>功能:只驗證UserVo中group為"insert.class"的屬性</h6>
     * 
     * @param userVo
     * @return 
     */
    @RequestMapping("validatedTwo")
    public String validatedTwo(@Validated(ToolInterface.insert.class) UserVo userVo) {
        MessageBean messageBean = new MessageBean("哈哈哈,通過驗證了");

        return JSONObject.toJSONString(messageBean);
    }

    /**
     * <h6>功能:只驗證UserVo中group為"update.class"的屬性</h6>
     * 
     * @param userVo
     * @return 
     */
    @RequestMapping("validatedThree")
    public String validatedThree(@Validated(ToolInterface.update.class) UserVo userVo) {
        MessageBean messageBean = new MessageBean("哈哈哈,通過驗證了");

        return JSONObject.toJSONString(messageBean);
    }

    /**
     * <h6>功能:只驗證UserVo中同時滿足多個group的屬性(一般不使用這個)</h6>
     * all.class中同時包含了insert.class和update.class
     * @param userVo
     * @return 
     */
    @RequestMapping("validatedFour")
    public String validatedFour(@Validated(ToolInterface.all.class) UserVo userVo) {
        MessageBean messageBean = new MessageBean("哈哈哈,通過驗證了");

        return JSONObject.toJSONString(messageBean);
    }

    /**
     * <h6>功能:直接參數校驗</h6>
     * 驗證框架里面大部分都不需要我們顯示設置message,每個注解框架都給了一個默認提示語,大多數提示還都比較友好
     * 不建議對原始類型數據如int進行參數校驗(支持不好,會報異常),建議綁定實體參數校驗,如上面幾個方法的校驗方式
     * @param name
     * @param bindingResult
     * @return 
     */
    @RequestMapping("validatedFive")
    public String validatedFive(
            @NotBlank(message = "姓名不能為空") String name,
            @Min(value = 10, message = "年齡必須大于10歲") Integer age
            ) {
        MessageBean messageBean = new MessageBean("哈哈哈,通過驗證了");

        return JSONObject.toJSONString(messageBean);
    }
}
5.2.3 測試

SpringBoot中如何使用Validation進行參數校驗

SpringBoot中如何使用Validation進行參數校驗

SpringBoot中如何使用Validation進行參數校驗

SpringBoot中如何使用Validation進行參數校驗

SpringBoot中如何使用Validation進行參數校驗

6. MessageBean消息處理類

import java.util.Date;

/**
 * @功能描述: JSON模型 用戶后臺向前臺返回的JSON對象
 */
public class MessageBean {
    private int code = 200; // 返回編碼
    private String message = "";    // 提示信息
    private Object data = null;     // 其他信息
    private Long time = new Date().getTime();

    public MessageBean() {
        super();
    }

    public MessageBean(String message) {
        super();
        this.message = message;
    }

    public MessageBean(Object data) {
        super();
        this.data = data;
    }

    public MessageBean(int code, String message) {
        super();
        this.code = code;
        this.message = message;
    }

    public MessageBean(String message, Object data) {
        super();
        this.message = message;
        this.data = data;
    }

    public MessageBean(int code, String message, Object data) {
        super();
        this.code = code;
        this.message = message;
        this.data = data;
    }

    // get、set方法略過,如果使用Lombok則不需要寫get、set方法了
}

更多相關知識點內容:

springboot使用validation校驗類的具體示例

springBoot如何實現參數校驗/參數驗證

以上就是使用Validation進行參數校驗的具體操作,代碼詳細清楚,如果在日常工作遇到這個問題,希望你能通過這篇文章解決問題。如果想了解更多相關內容,歡迎關注億速云行業資訊頻道!


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

道真| 南靖县| 铁岭市| 涿州市| 中卫市| 大邑县| 遂溪县| 永安市| 保靖县| 庆阳市| 右玉县| 宣化县| 河津市| 木里| 兴海县| 民勤县| 边坝县| 德钦县| 华蓥市| 吉水县| 抚松县| 宜宾市| 济宁市| 德安县| 玉树县| 寻乌县| 永登县| 濮阳县| 壤塘县| 通化县| 定陶县| 隆子县| 安新县| 镇平县| 沙坪坝区| 祁阳县| 房山区| 勃利县| 云霄县| 宁化县| 桐庐县|