springboot统一校验validator实现

第一步:

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进行测试

134c9ee6d634ad6be2c145d45f1198936c2.jpg

981eb7cd26579ab78cdbe31c781dfd1aaf7.jpg

 

tips:本人尝试了各种方法实现,但是最后选择了该方案。因为我想实体bean生成的链接为&=?,在使用全部元注解形式时,出现swagger文档生成有误。

更加简单易用的方法,烦请大家可以告知,谢谢!

转载于:https://my.oschina.net/u/1017791/blog/3054515

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 提供了一种基于注解的方式来实现校验,即使用 `javax.validation` 标准规范中的注解来实现校验。如果需要自定义校验规则,可以按照以下步骤进行: 1. 创建自定义注解 ```java @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MyValidator.class) public @interface MyValidation { String message() default "Invalid field"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` 2. 创建自定义校验器 ```java public class MyValidator implements ConstraintValidator<MyValidation, String> { @Override public void initialize(MyValidation constraintAnnotation) { // 初始化 } @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 自定义校验逻辑 return value != null && value.startsWith("prefix"); } } ``` 3. 在需要校验的字段上添加自定义注解 ```java public class MyEntity { @MyValidation private String myField; // getter/setter } ``` 4. 在 Controller 中使用 `@Validated` 注解进行校验 ```java @RestController @RequestMapping("/my-entity") @Validated public class MyController { @PostMapping public MyEntity create(@RequestBody @Valid MyEntity entity) { // 创建实体 } } ``` 在上面的示例中,`MyValidation` 注解和 `MyValidator` 校验实现了一个自定义的校验规则,用于判断字符串是否以 "prefix" 开头。在 `MyEntity` 实体类中,使用了 `@MyValidation` 注解来标注需要校验的字段。在 `MyController` 中,使用了 `@Validated` 注解来开启校验,并在 `create()` 方法中使用 `@RequestBody @Valid` 注解来对请求体进行校验。 以上就是使用 Spring Boot 自定义校验规则的步骤。需要注意的是,自定义的校验注解需要使用 `@Constraint` 注解进行标注,并指定校验器的实现类。校验器需要实现 `ConstraintValidator` 接口,并指定校验注解和校验字段的类型。在校验逻辑中,可以使用 `ConstraintValidatorContext` 对象来进行错误信息的设置。在 Controller 中,需要使用 `@Validated` 注解开启校验,并在需要校验的参数上使用 `@Valid` 注解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值