首先引入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;
}
}
请求