高碑店建设局网站,衡水精品网站建设,网络营销导向企业网站建设的一般原则包括,天津哪里做网站最好一、Bean Validation简介
Bean Validation是Java定义的一套基于注解的数据校验规范#xff0c;目前已经从JSR 303的1.0版本升级到JSR 349的1.1版本#xff0c;再到JSR 380的2.0版本#xff08;2.0完成于2017.08#xff09;#xff0c;目前最新稳定版2.0.2#xff08;201…一、Bean Validation简介
Bean Validation是Java定义的一套基于注解的数据校验规范目前已经从JSR 303的1.0版本升级到JSR 349的1.1版本再到JSR 380的2.0版本2.0完成于2017.08目前最新稳定版2.0.2201909 对于spring boot应用直接引用它提供的starter
!-- 基于注解的数据校验规范 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependency二、常用注解
常用注解如下 直接在Controller层使用
RestController
RequestMapping(/app/api)
Validated
Slf4j
public class SpringGuaranteeReportController {RequestMapping(/sendSpringGuaranteeReport)public ResultObjectString sendSpringGuaranteeReport(Min(value 1) Max(value 2) Integer mmsType,Min(value 1) Max(value 2) Integer groupType,NotBlank String opTime) {…………}
}
一个简单的接口传入一个Person对象加上Valid启用校验bindingResult里面就包含了参数校验的结果
Data
public class Person {NotBlank(message 姓名不能为空)private String name;NotBlank(message 性别不能为空)private String sex;NotNull(message 年龄不能为空)Max(value 100, message 年龄不能超过100)private Integer age;Email(message 电子邮箱格式错误)private String email;Pattern(regexp ^1[3|4|5|7|8][0-9]{9}$)private String phone;NotEmpty(message 兴趣不能为空)private ListString hobby;
}
这里做了判空和基本格式校验 其中关于NotEmpty、NotNull、NotBlank的区别 简单来说在Integer或者自定义对象中使用NotNull在String上使用NotBlank在集合上使用NotEmpty
三、配置类
validate参数校验默认的是一个参数校验失败后还会继续校验后面的参数通过这个配置改成校验参数时只要出现校验失败的情况就立即抛出对应的异常结束校验不再进行后续的校验
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;/*** validate参数校验默认的是一个参数校验失败后还会继续校验后面的参数* 通过这个配置改成校验参数时只要出现校验失败的情况就立即抛出对应的异常结束校验不再进行后续的校验*/
Configuration
public class ValidationConfig {Beanpublic Validator validator() {ValidatorFactory validatorFactory Validation.byProvider(HibernateValidator.class).configure()/**failFast的意思只要出现校验失败的情况就立即结束校验不再进行后续的校验*/.failFast(true).buildValidatorFactory();return validatorFactory.getValidator();}Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() {MethodValidationPostProcessor methodValidationPostProcessor new MethodValidationPostProcessor();methodValidationPostProcessor.setValidator(validator());return methodValidationPostProcessor;}}validate参数校验失败后返回的json数据可能并不是咱们最终想要的下图就是校验失败后它默认返回的数据 一般情况下咱们可能只需要图中标红的那个提示信息就OK了 那怎么改它的返回数据呢 只要添加一个异常处理类就行了捕获抛出的异常
import com.ai.boy.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;/*** 全局异常处理*/
ControllerAdvice
Slf4j
public class GlobalHandlerExceptionResolver {/*** 处理请求中 使用Valid 验证路径中请求实体校验失败后抛出的异常*/ExceptionHandler(BindException.class)ResponseBodypublic R BindExceptionHandler(BindException e) {String message e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());return R.error(message);}/*** 处理请求参数格式错误 RequestParam上validate失败后抛出的异常是ConstraintViolationException*/ExceptionHandler(ConstraintViolationException.class)ResponseBodypublic R ConstraintViolationExceptionHandler(ConstraintViolationException e) {String message e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());return R.error(message);}/*** 处理未知异常* */ExceptionHandler(Exception.class)ResponseBodypublic R error(HttpServletResponse response, Exception e){log.info(未知异常信息:{},e.getMessage());return R.error(未知异常请联系管理员);}}