美文网首页js css htmlspringboot
参数校验 关于spring-boot-starter-valid

参数校验 关于spring-boot-starter-valid

作者: flyjar | 来源:发表于2022-06-27 08:36 被阅读0次

前言

  • jdk javax.validation包下的接口
  • hibernate validation实现类
  • spring-boot validation实现类

一、jdk javax.validation?

  • 就是一个规范, 所有实现类必须是线程安全的, 提供以下注解, 但并不提供实现


    20201208153453342.png
  • 提供实现接口
public interface ConstraintValidator<A extends Annotation, T> {

二、hibernate validation

  • 实现了jdk Validator接口以及ExecutableValidator接口
public class ValidatorImpl implements Validator, ExecutableValidator {
  • 也新增了一批注解


    20201208155006608.png
  • 提供接口实现:


    20201208155210226.png

三 spring-boot-starter-validation

  • 定义Validator以及SmartValidator接口, 添加了hibernate的包, 提供@Validated支持spring环境,支持验证组的规范, 支持在spring mvc的环境中使用,提供了一系列的工厂类, 以及适配器;

四 使用

一 基本使用:
@RestController
public class UserController {

    @RequestMapping
    public Response<Object> login(@Validated UserLogin user) {
        return Response.builder().code(200).message("ok").data("ok").build();
    }
}
@Data
public class UserLogin {

    @NotBlank
    @Size(max = 10)
    private String username;

    private String password;
}
二 新增自定义注解
@Documented
@Constraint(validatedBy = {GenderValidator.class})
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GenderValidation {

    String message() default "性别取值范围不对";

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

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

public class GenderValidator implements ConstraintValidator<GenderValidation, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }
        return value.equals("男") || value.equals("女");
    }

    @Override
    public void initialize(GenderValidation constraintAnnotation) {

    }
}
@Data
public class UserLogin {

    @NotBlank
    @Size(max = 10)
    private String username;

    private String password;

    // 添加注解, 用以启用自定义注解校验
    @GenderValidation
    private String gender;
}
三 自定义Validator
@Configuration
public class UserValidator implements Validator {


    @Override
    public boolean supports(Class<?> clazz) {
        return clazz.equals(UserLogin2.class);
    }

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "username", "username.empty");
        ValidationUtils.rejectIfEmpty(errors, "password", "password.empty");
        UserLogin2 userLogin2 = (UserLogin2) target;
        System.out.println(userLogin2);
    }
}

@RestController
public class UserController extends ValidationInitController {
    @Autowired
    private UserValidator userValidator;

    @InitBinder
    public void initBinder(WebDataBinder dataBinder) {
        dataBinder.setValidator(userValidator);
    }
    @RequestMapping("/login")
    public Response<Object> login(@Validated @RequestBody UserLogin2 user) {
        return Response.builder().code(200).message("ok").data("ok").build();
    }
}

@Data
@ToString
public class UserLogin2 {

    private String username;

    private String password;
}

四 分组校验
@Data
@ToString
public class UserLogin4 {

    @NotNull(groups = {UserUpdate.class}, message = "userId not null")
    private Integer userId;

    private String username;

    private String password;

    public interface UserInsert extends Default {
    }

    public interface UserUpdate extends Default {
    }
}

@RestController
public class UserController {

    @RequestMapping("/user/insert")
    public Response<Object> userInsert(@Validated(UserLogin4.UserInsert.class) @RequestBody UserLogin4 user) {
        return Response.builder().code(200).message("ok").data("ok").build();
    }

    @RequestMapping("/user/update")
    public Response<Object> userUpdate(@Validated(UserLogin4.UserUpdate.class) @RequestBody UserLogin4 user) {
        return Response.builder().code(200).message("ok").data("ok").build();
    }
}

相关文章

网友评论

    本文标题:参数校验 关于spring-boot-starter-valid

    本文链接:https://www.haomeiwen.com/subject/zgiivrtx.html