第一步:web
pom.xml需引入spring-boot-start-web依賴,其中包含validator框架包spring
<!--Spring Boot Web依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
第二步:app
配置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; } }
第三步:ide
編寫手動驗證類,驗證失敗時,以異常拋出spring-boot
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()); } } }
第四步:post
建立統一異常處理類,分別對方法參數異常、實體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(); } }
第五步:ui
建立測試實體bean,並添加校驗規則this
@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文檔生成有誤。
更加簡單易用的方法,煩請你們能夠告知,謝謝!