我发布了一个自认为很厉害的 Java 参数校验组件,它几乎可以满足所有的参数校验场景,请各位 V 友发表一些看法

29次阅读

共计 623 个字符,预计需要花费 2 分钟才能阅读完成。

如题,组件名为“SpEL Validator”,下面我会进行一些介绍,希望各位看完后可以发表一些看法。

「SpEL Validator」是基于 SpEL 的参数校验包,也是 javax.validation 的扩展增强包,用于简化参数校验。

解决了什么问题?

  • 枚举值字段校验:

    @SpelAssert(assertTrue = "T(cn.sticki.enums.UserStatusEnum).getByCode(#this.userStatus) != null", message = "用户状态不合法")
    private Integer userStatus;
    
  • 多字段联合校验:

    @NotNull
    private Integer contentType;
    
    @SpelNotNull(condition = "#this.contentType == 1", message = "语音内容不能为空")
    private Object audioContent;
    
    @SpelNotNull(condition = "#this.contentType == 2", message = "视频内容不能为空")
    private Object videoContent;
    
  • 复杂逻辑校验,调用静态方法:

    // 中文算两个字符,英文算一个字符,要求总长度不超过 10
    // 调用外部静态方法进行校验
    @SpelAssert(assertTrue = "T(cn.sticki.util.StringUtil).getLength(#this.userName) <= 10", message = "用户名长度不能超过 10")
    private String userName;
    
  • 调用 Spring Bean(需要使用 @EnableSpelValidatorBeanRegistrar 开启 Spring Bean 支持):

    // 这里只是简单举例,实际开发中不建议这样判断用户是否存在
    @SpelAssert(assertTrue = "@userService.getById(#this.userId) != null", message = "用户不存在")
    private Long userId;
    
  • 等待探索……

我认为的特点

  • 强大的参数校验功能,几乎支持所有场景下的参数校验。
  • 扩展自 javax.validation 包,只新增不修改,无缝集成到项目中。
  • 基于 SpEL(Spring Expression Language)表达式,支持复杂的校验逻辑。
  • 支持调用 Spring Bean,可在表达式中使用注入过的 Spring Bean。
  • 校验时基于整个对象,支持对象内字段间的校验逻辑。
  • 支持自定义校验注解,可根据业务需求自定义校验逻辑。
  • 无需额外的异常处理,校验失败时会上报到 javax.validation 的异常体系中。
  • 简单易用,使用方式几乎与 javax.validation 一致,学习成本低,上手快。

使用方式

  • 添加依赖

    Latest Version:
    我发布了一个自认为很厉害的 Java 参数校验组件,它几乎可以满足所有的参数校验场景,请各位 V 友发表一些看法

    
        cn.sticki
        spel-validator
        Latest Version
    
    
    
        org.hibernate.validator
        hibernate-validator
        ${hibernate-validator.version}
    
    
    
        org.springframework.boot
        spring-boot-starter-web
        ${spring-boot-starter-web.version}
    
    
  • 在接口参数上使用 @Valid@Validated 注解

    @RestController
    @RequestMapping("/example")
    public class ExampleController {
    
      /**
       * 简单校验示例
       */
      @PostMapping("/simple")
      public Resp simple(@RequestBody @Valid SimpleExampleParamVo simpleExampleParamVo) {return Resp.ok(null);
      }
    
    }
    
  • 在实体类上使用 @SpelValid 注解,同时在需要校验的字段上使用 @SpelNotNull 等约束注解

    @Data
    @SpelValid
    public class SimpleExampleParamVo {
    
      @NotNull
      private Boolean switchAudio;
    
      /**
       * 当 switchAudio 为 true 时,校验 audioContent,audioContent 不能为 null
       */
      @SpelNotNull(condition = "#this.switchAudio == true", message = "语音内容不能为空")
      private Object audioContent;
    
    }
    
  • 发起请求,即可看到校验结果

性能上我目前还没有进行测试,但代码里使用了很多的反射,会有一定的损耗,后面我准备多加一些缓存,尽量降低性能上的影响。

大概就是这样

以上是关于这个组件的大概介绍,希望各位大佬能够对此发表一些看法,好或者不好都可以发表,感谢各位~

感兴趣的朋友也可以到 GitHub 或者掘金查看详细情况。

GitHub 地址:https://github.com/stick-i/spel-validator

我在掘金发布的详细说明文章:https://juejin.cn/post/7365698962531401766

正文完
 0