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; }