SpringBoot 使用validation數據校驗


后端對數據進行驗證

添加包

hibernate-validator

    <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.2.Final</version>
        </dependency>

或者添加spring-boot-starter-validation

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>1.4.0.RELEASE</version>
        </dependency>

或者添加spring-boot-starter-web

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

這兩個springboot包里面都包含hibernate-validator包,這三個包只有有一個就可以

二:返回信息

我這里通過拋出異常來統一返回異常信息

import com.shitou.huishi.contract.datacontract.code.RspCode;
import com.shitou.huishi.contract.datacontract.exception.AuthException;
import com.shitou.huishi.contract.datacontract.response.DataResponse;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Created by qhong on 2018/5/28 15:51
 **/
@ControllerAdvice
public class GlobalExceptionHandler {

    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 登陸異常
     * @param req
     * @param e
     * @return
     * @throws AuthException
     */
    @ExceptionHandler(value = AuthException.class)
    @ResponseBody
    public DataResponse handleAuthException(HttpServletRequest req, AuthException e) throws AuthException {
        DataResponse r = new DataResponse();
        r.setResCode(e.getCode()+"");
        r.setMsg(e.getMsg());
        logger.info("AuthException",e.getMsg());
        return r;
    }

    /**
     * 驗證異常
     * @param req
     * @param e
     * @return
     * @throws MethodArgumentNotValidException
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public DataResponse handleMethodArgumentNotValidException(HttpServletRequest req, MethodArgumentNotValidException e) throws MethodArgumentNotValidException {
        DataResponse r = new DataResponse();
        BindingResult bindingResult = e.getBindingResult();
        String errorMesssage = "Invalid Request:\n";

        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            errorMesssage += fieldError.getDefaultMessage() + "\n";
        }
        r.setResCode(RspCode.VERIFICATION_DOES_NOT_PASS.getCode());
        r.setMsg(errorMesssage);
        logger.info("MethodArgumentNotValidException",e);
        return r;
    }

    /**
     * 全局異常
     * @param req
     * @param e
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public DataResponse handleException(HttpServletRequest req, Exception e) throws Exception {
        DataResponse r = new DataResponse();
        r.setResCode(RspCode.CODE_ERROR.getCode());
        r.setMsg(RspCode.CODE_ERROR.getMessage()+","+e.getMessage());
        logger.error(e.getMessage(),e);
        return r;
    }
}

三:具體代碼

總結框架提供了那些校驗:

JSR提供的校驗注解:         
@Null   被注釋的元素必須為 null    
@NotNull    被注釋的元素必須不為 null    
@AssertTrue     被注釋的元素必須為 true    
@AssertFalse    被注釋的元素必須為 false    
@Min(value)     被注釋的元素必須是一個數字,其值必須大於等於指定的最小值    
@Max(value)     被注釋的元素必須是一個數字,其值必須小於等於指定的最大值    
@DecimalMin(value)  被注釋的元素必須是一個數字,其值必須大於等於指定的最小值    
@DecimalMax(value)  被注釋的元素必須是一個數字,其值必須小於等於指定的最大值    
@Size(max=, min=)   被注釋的元素的大小必須在指定的范圍內    
@Digits (integer, fraction)     被注釋的元素必須是一個數字,其值必須在可接受的范圍內    
@Past   被注釋的元素必須是一個過去的日期    
@Future     被注釋的元素必須是一個將來的日期    
@Pattern(regex=,flag=)  被注釋的元素必須符合指定的正則表達式    


Hibernate Validator提供的校驗注解:  
@NotBlank(message =)   驗證字符串非null,且trim后長度必須大於0    
@Email  被注釋的元素必須是電子郵箱地址    
@Length(min=,max=)  被注釋的字符串的大小必須在指定的范圍內    
@NotEmpty   被注釋的字符串的必須非空    
@Range(min=,max=,message=)  被注釋的元素必須在合適的范圍內

Code:

    @Range(min=1,max=2,message = "檔案類型錯誤")
    private Integer archiveType;

    @NotBlank(message = "檔案主體名稱不能為空")
    private String subjectName;

    @NotBlank(message = "證件號不能為空")
    private String subjectNo;

Controller:

public DataResponse createArchive(@RequestBody @Valid ArchiveInfoRequest request)

添加@Valid或者@Validated都可以。

補充:

網上提供的其他異常:

    @ExceptionHandler(value =BindException.class)
    @ResponseBody
    public DataResponse handleBindException(BindException e) throws BindException {
        // ex.getFieldError():隨機返回一個對象屬性的異常信息。如果要一次性返回所有對象屬性異常信息,則調用ex.getAllErrors()
        FieldError fieldError = e.getFieldError();
        StringBuilder sb = new StringBuilder();
        sb.append(fieldError.getField()).append("=[").append(fieldError.getRejectedValue()).append("]")
                .append(fieldError.getDefaultMessage());
        // 生成返回結果
        DataResponse r = new DataResponse();
        r.setResCode(RspCode.VERIFICATION_DOES_NOT_PASS.getCode());
        r.setMsg(sb.toString());
        logger.info("BindException", e);
        return r;
    }

 

https://blog.csdn.net/u013815546/article/details/77248003

https://blog.csdn.net/hry2015/article/details/79572713


免責聲明!

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



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