首页 > 其他分享 >spring boot 参数校验

spring boot 参数校验

时间:2023-01-02 23:44:27浏览次数:33  
标签:String spring boot 校验 id 注解 ElementType public

目录

添加依赖

  • 添加如下依赖,springboot自动帮我们开启校验
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
  • 在springboot

使用方式

  • 在Controller类上使用@Validated
@RestController
@RequestMapping(value = "/user/")
@Validated
public class UserController {
...
}
  • 在需要校验的请求参数前添加@Valid
   @PutMapping
    public Result addBlog(@Valid @RequestBody UserTestRequest request) {
        return Result.success("新增成功");
    }
  • 数据库操作保存前会进行校验

可用注解

  • jakarta.validation.constraints下的注解
  • org.hibernate.validator.constraints下的注解

自定义注解的使用

  • 自定义注解,指定校验器
    ValuesInEnum@interface
@Documented
@Constraint(
        validatedBy = {ValueInEnumValidator.class} //指定校验器,该校验器自定义校验逻辑
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(ValuesInEnum.List.class)
public @interface ValuesInEnum {
    String message() default "";

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

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

    /*** 支持的枚举值 */
    String[] enums() default {};

    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface List {
        ValuesInEnum[] value();
    }
}
  • 实现校验器
    通过实现jakarta.validation.ConstraintValidator接口完成自定义注解
    ValueInEnumValidator.class
//A 注解类型,注解标注的对象类型
public interface ConstraintValidator<A extends Annotation, T> {
    default void initialize(A constraintAnnotation) {
    }

    boolean isValid(T var1, ConstraintValidatorContext var2);
}

#具体实现
public class ValueInEnumValidator implements ConstraintValidator<ValuesInEnum, Object> {

    private String[] enums;

    @Override
    public void initialize(ValuesInEnum constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
        enums = constraintAnnotation.enums();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (enums.length == 0) {
            return true;
        }
        if (Objects.isNull(value)) {
            return false;
        }
        return Arrays.stream(enums).anyMatch(e ->
                Objects.equals(String.valueOf(e), String.valueOf(value))
        );
    }
}
  • 使用注解
#请求参数
public class UserTestRequest extends AbstractRequest {
    @NotBlank(message = "id不能为空")
    private String id;
    @NotNull(message = "审批状态不能为空")
    @ValuesInEnum(enums = {"1", "2", "3"}, message = "审批状态必须为[1,2,3]")
    @FieldDesc(name = "审批状态")
    private Integer status;

    public UserTestRequest() {
    }

    public UserTestRequest(String id, Integer status) {
        this.id = id;
        this.status = status;
    }

    public UserTestRequest(HttpRequest request, HttpResponse response, String id, Integer status) {
        super(request, response);
        this.id = id;
        this.status = status;
    }

    public String getId() {
        return id;
    }

    public Integer getStatus() {
        return status;
    }
}


#controller

@RestController
@RequestMapping(value = "/user/")
public class UserController {

    @PutMapping
    public Result addBlog(@Valid @RequestBody UserTestRequest request) {
        return Result.success("新增成功");
    }
}


标签:String,spring,boot,校验,id,注解,ElementType,public
From: https://www.cnblogs.com/jinit/p/17020066.html

相关文章

  • 责任链实现网关统一校验
    一、CommonsChain介绍ChainOfResponsibility(COR)模式也叫职责链模式或者职责连锁模式,是由GoF提出的23种软件设计模式的一种。ChainofResponsibility模式是行为模式之一......
  • spring redis 注解开发 单片机 集群 主从复制
    失败记录,虽然最终没有成功,但是原理还是知道的 1、springreids简单实现注解 1、导入相应依赖 <dependency><groupId>redis.clients</groupId>jedis<......
  • 基于Springboot+SSM框架旅游系统项目开发与设计(附源码资料)-毕业设计
    1.项目简介这是一个Springboot旅游网站管理系统,管理员角色包含以下功能:管理员登录,用户管理,旅游路线管理,旅游景点管理,酒店管理,旅游攻略管理,车票管理,订单管理,数据分......
  • 深入 Spring 系列之静态资源处理
    1.背景前一段时间,WebIDE开源的过程中,无意间接触到 ​​webjars​​,觉得比较有趣,于是研究并整理了一下。webjars是将前端的库(比如jQuery)打包成Jar文件,然后使用基于JV......
  • Spring Security 源码分析(四):Spring Social实现微信社交登录
    前言在上一章Spring-Security源码分析三-Spring-Social社交登录过程中,我们已经实现了使用​​SpringSocial​​​+​​Security​​的QQ社交登录。本章我们将实现微信的社......
  • Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
    一、为啥整合Dubbo实现SOADubbo不单单只是高性能的RPC调用框架,更是SOA服务治理的一种方案。核心:1.远程通信,向本地调用一样调用远程方法。2.集群容错3.服务自动发......
  • Spring 事务源码(三):事务相关对象的创建
    事务源码(二)中,已经分析了beanDefinition的加载,下面来创建对应beanDefinition的bean。1、PropertySourcesPlaceholderConfigurer创建占位符处理的beanPropertyS......
  • Spring注解综合应用
    需求通过注解方式,实现下面xml的配置(实现“控制层(controller)--业务逻辑层(service)--dao层--数据源”的关系)<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="ht......
  • Spring AOP源码(四):创建被代理类的代理对象
    在AOP源码(三):创建AOP相关的Bean中,介绍了Spring创建AOP的Advisor、AnnotationAwareAspectJAutoProxyCreator的创建,其中被代理类的代理对象是如何创建的未做说明,下面来......
  • spring cache
    SpringCache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。SpringCache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过Cache......