springboot統一校驗validator實現

第一步: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文檔生成有誤。

更加簡單易用的方法,煩請你們能夠告知,謝謝!

相關文章
相關標籤/搜索