spring-boot-starter-validation

本文详细介绍了Java校验框架的使用,包括JDK的`java.validation`规范、Hibernate Validation的实现、Spring Boot的`spring-boot-starter-validation`集成,以及如何进行基本使用、自定义注解、自定义Validator和编程方式的手动校验。同时,通过示例展示了分组验证的实践,适合理解与掌握Java验证机制。
摘要由CSDN通过智能技术生成


# 前言
  1. jdk javax.validation包下的接口
  2. hibernate validation实现类
  3. spring-boot validation实现类

一、jdk java.validation?

就是一个规范, 所有实现类必须是线程安全的, 提供以下注解, 但并不提供实现
在这里插入图片描述
提供实现接口

public interface ConstraintValidator<A extends Annotation, T> {

二、hibernate validation

实现了jdk Validator接口以及ExecutableValidator接口

public class ValidatorImpl implements Validator, ExecutableValidator {

新增以下注解:
在这里插入图片描述
提供接口实现:
在这里插入图片描述

三 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

此方式为实现对对象的校验
代码如下(示例):
实现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;
}

四 使用编程方式启动校验(hibernate手动)

代码如下(示例):

// 配置到spring中, 或者采用其它方式也可以
// 直接使用hibernate提供的验证实现
@Configuration
public class HibernateValidationConfig {

    @Bean
    public Validator init() {
        HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class).configure();
        // 快速失败模式, 检查到第一个失败就返回
        ValidatorFactory factory = configuration.failFast(true).buildValidatorFactory();
        return factory.getValidator();
    }
}
@RestController
public class UserController extends ValidationInitController {

    @Qualifier("init")
    @Autowired
    private Validator validator;

    @RequestMapping
    public Response<Object> login(UserLogin3 user) {
        Set<ConstraintViolation<UserLogin3>> validate = validator.validate(user);
        // 如果验证失败, 只会有一条数据
        for (ConstraintViolation<UserLogin3> userLoginConstraintViolation : validate) {
            String message = userLoginConstraintViolation.getMessage();
            System.out.println(message);
        }
        return Response.builder().code(200).message("ok").data("ok").build();
    }
}

五 分组验证

代码如下(示例):

@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设置统一返回处理类, 对异常处理即可, 这里就不贴出来了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值