第一步:
pom.xml需引入spring-boot-start-web依赖,其中包含validator框架包
<!--Spring Boot Web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
第二步:
配置validator,校验规则
@Configuration public class ValidatorConfig { @Bean public Validator validator(){ ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class ) .configure() // true-快速失败返回模式 false-普通模式 .addProperty( "hibernate.validator.fail_fast", "true" ) .buildValidatorFactory(); Validator validator = validatorFactory.getValidator(); return validator; } @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); /**设置validator模式为快速失败返回*/ postProcessor.setValidator(validator()); return postProcessor; } }
第三步:
编写手动验证类,验证失败时,以异常抛出
public class ValidateUtil { /** * 实体校验 * * @param obj * @throws EddueException */ public static <T> void validate(T obj) throws EddueException { Validator validator = SpringContextUtil.getBean(Validator.class); Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj, new Class[0]); if (constraintViolations.size() > 0) { ConstraintViolation<T> validateInfo = (ConstraintViolation<T>) constraintViolations.iterator().next(); // validateInfo.getMessage() 校验不通过时的信息,即message对应的值 throw new EddueException(CodeEnum.SYS_PARAM.getCode(), validateInfo.getMessage()); } } }
第四步:
创建统一异常处理类,分别对方法参数异常、实体bean参数处理
@ControllerAdvice public class GlobalExceptionHandler { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * @param e * @return com.eddue.datav.base.ResponseResult * @description 方法参数异常处理 */ @ExceptionHandler(value = {ConstraintViolationException.class}) @ResponseBody public ResponseResult handleResourceNotFoundException(ConstraintViolationException e) { Set<ConstraintViolation<?>> violations = e.getConstraintViolations(); StringBuilder strBuilder = new StringBuilder(); for (ConstraintViolation<?> violation : violations) { strBuilder.append(violation.getMessage()); } return ResponseResult.builder().code(CodeEnum.SYS_SERVER_ERROR.getCode()).msg(strBuilder.toString()).build(); } /** * @param ex * @return com.eddue.cloudteacher.exception.ResponseResult * @description 实体bean参数异常处理 */ @ExceptionHandler(EddueException.class) @ResponseBody public ResponseResult eddueExceptionHandler(EddueException ex) { return ResponseResult.builder().code(ex.code).msg(ex.getMessage()).build(); } }
第五步:
创建测试实体bean,并添加校验规则
@ApiModel(value="systemParam",description="用户登录参数") public class UserLoginRequest extends AbstractSystemParam { @NotEmpty(message = "手机号码不能为空") @ApiModelProperty(value="手机号",name="mobile") private String mobile; @NotEmpty(message = "密码不能为空") @ApiModelProperty(value="密码",name="mobile") private String password; public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
第六步:
在controller中,添加方法和实体bean参数校验方法
@GetMapping(value = "/test") @ApiOperation("测试") public ResponseResult login(@NotEmpty(message = "不能为空")@RequestParam("test") String test) { return ResponseUtil.success(); } @GetMapping(value = "/login") @ApiOperation("登录") public ResponseResult login(UserLoginRequest request) { ValidateUtil.validate(request); return null; }
第七步:
使用swagger进行测试
tips:本人尝试了各种方法实现,但是最后选择了该方案。因为我想实体bean生成的链接为&=?,在使用全部元注解形式时,出现swagger文档生成有误。
更加简单易用的方法,烦请大家可以告知,谢谢!