后端對數據進行驗證
添加包
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; }