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

posted @ 2018-06-13 17:49  hongdada  阅读(18276)  评论(2编辑  收藏  举报