SpringBoot下Validation自定义验证注解(简单实现)

时间:2022-10-17 17:05:09

首先引入validation依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

自定义解析器

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
 

/**
  * @Author: yipeng.liu
  * @Date: 2022/9/13 14:41
  * @Description: 自定义验证 解析器
  */

public class CustomValidatorConfig implements ConstraintValidator<CustomValidator,String> {
  
    @Override
    public boolean isValid(String value,ConstraintValidatorContext context) {
        System.out.println("进入验证>>>>>>>>>>>>>>>>>>>>");
        return value != null &&value.equals("123");
    }
}

需要实现ConstraintValidator接口,第一个是自定义注解,第二个是注解修饰的属性类型,然后我们需要重写isValid方法,如果返回true,则表示验证通过,如果返回false,表示验证失败并抛出异常。

isValid(String value, ConstraintValidatorContextcontext) 传入的第一个参数就是需要验证的字段值。既然已经拿到验证字段了,便可以使用来进行我们业务逻辑的校验。

自定义注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

 
/**

 * @Author: yipeng.liu

 * @Date: 2022/9/13 14:40

 * @Description:

 */

@Documented
@Target(value =ElementType.FIELD)
@Retention(value =RetentionPolicy.RUNTIME)
@Constraint(validatedBy= CustomValidatorConfig.class)
public @interface CustomValidator {

    String message() default "Incorrectdate format";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

自定义注解比普通注解多出@Constraint来进行修饰,validatedBy就是我们上方写的注解校验器CustomValidateDateConfig)如果两个ConstraintValidator(验证器)引用同一类型,将发生异常。

这里需要加上groups属性来提供分组校验功能,否则valid校验的时候会抛出异常提示没有groups属性,

payload同理

使用

请求对象CustomValidateDTO

import com.example.demo.annotation.CustomValidator;
import lombok.Data;
import javax.validation.constraints.NotNull;

/**

- @Author: yipeng.liu
- @Date: 2022/9/13 14:55
- @Description:

 */

@Data
public class CustomValidateDTO {


    @CustomValidator(message = "参数不正确")
    private String data;
    @NotNull
    private String str;
}

控制层ValidateTestController

import com.example.demo.domain.CustomValidateDTO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;

/**

- @Author: yipeng.liu
- @Date: 2022/9/13 14:53
- @Description:
  */

@RestController
public class ValidateTestController {

    @PostMapping("customValidate")
    public boolean test(@Valid @RequestBodyCustomValidateDTO customValidateDTO) {
       System.out.println(customValidateDTO.getData());
       return true;
    }

}

请求 SpringBoot下Validation自定义验证注解(简单实现)