当前位置: 首页 > news >正文

免费做元宵节卡片的网站seo的作用有哪些

免费做元宵节卡片的网站,seo的作用有哪些,男生可以做网站编辑工作吗,网站转换模块怎么做前言 大家好,我是阿杆,不是阿轩。 参数校验这个东西,很多情况下都是比较简单的,用 NotNull、Size 等注解就可以解决绝大多数场景,但也有一些场景是这些基本注解解决不了的,只能用一些其他的方式处理&…

前言

大家好,我是阿杆,不是阿轩。

参数校验这个东西,很多情况下都是比较简单的,用 @NotNull@Size 等注解就可以解决绝大多数场景,但也有一些场景是这些基本注解解决不了的,只能用一些其他的方式处理,这样就导致参数校验变成了多层,其实是不利于代码维护的。

于是乎,我写了一套几乎可以满足任何场景的参数校验组件,非常好用,安利给大家。

GitHub:stick-i/spel-validator: 一个强大的 Java 参数校验包,基于 SpEL 实现,扩展自 javax.validation 包,几乎支持所有场景下的参数校验。 (github.com)

💡 它解决了什么问题?

  • 枚举值字段校验:

    @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 一致,学习成本低,上手快。

🎈 环境

目前仅测试了 JDK8 环境,理论上来说 JDK8+ 应该都是支持的。

📦 快速开始

  • 添加依赖

    Latest Version: 0.0.2-beta

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

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

    @Data
    @SpelValid
    public class SimpleExampleParamVo {@NotNullprivate Boolean switchAudio;/*** 当 switchAudio 为 true 时,校验 audioContent,audioContent 不能为null*/@SpelNotNull(condition = "#this.switchAudio == true", message = "语音内容不能为空")private Object audioContent;}
    
  • 添加全局异常处理器,处理校验异常

    @RestControllerAdvice
    public class ControllerExceptionAdvice {@ExceptionHandler({BindException.class, MethodArgumentNotValidException.class})public Resp<Void> handleBindException(BindException ex) {String msg = ex.getFieldErrors().stream().map(error -> error.getField() + " " + error.getDefaultMessage()).reduce((s1, s2) -> s1 + "," + s2).orElse("");return new Resp<>(400, msg);}}
    
  • 发起请求,即可看到校验结果

    • 示例一:@SpelNotNull 校验不通过

      请求体

      {"switchAudio": true,"audioContent": null
      }
      

      响应体

      {"code": 400,"message": "audioContent 语音内容不能为空","data": null
      }
      
    • 示例二:校验通过

      请求体

      {"switchAudio": false,"audioContent": null
      }
      

      响应体

      {"code": 200,"message": "成功","data": null
      }
      
    • 示例三:@NotNull 校验不通过

      请求体

      {"switchAudio": null,"audioContent": null
      }
      

      响应体

      {"code": 400,"message": "switchAudio 不能为null","data": null
      }
      

📖 使用指南

注意:本组件的目的不是代替 javax.validation 的校验注解,而是作为一个扩展,方便某些场景下的参数校验。能够使用 javax.validation 的场景就不要使用 spel-validator ,因为 spel-validator 会有一定的性能损耗。

开启约束校验

需要满足以下两个条件,才会对带注解的元素进行校验:

  1. 在接口参数上使用 @Valid@Validated 注解
  2. 在实体类上使用 @SpelValid 注解

如果只满足第一个条件,那么只会对带 @NotNull@NotEmpty@NotBlank 等注解的元素进行校验。

如果只满足第二个条件,那么不会对任何元素进行校验。

这是因为 @SpelValid 注解是基于 javax.validation.Constraint 实现的,只有在 @Valid@Validated 注解的支持下才会生效。
spel-validator 提供的约束注解是基于 @SpelValid 进行扫描校验的,只有在 @SpelValid 注解生效的情况下才会执行约束校验。

使用约束注解

目前支持的约束注解有:

注解说明对标 javax.validation
@SpelAssert逻辑断言校验
@SpelNotNull非 null 校验@NotNull
@SpelNotEmpty集合、字符串、数组大小非空校验@NotEmpty
@SpelNotBlank字符串非空串校验@NotBlank
@SpelNull必须为 null 校验@Null
@SpelSize集合、字符串、数组长度校验@Size

每个约束注解都包含三个默认的属性:

  • message:校验失败时的提示信息。
  • group:分组条件,支持 SpEL 表达式,当分组条件满足时,才会对带注解的元素进行校验。
  • condition:约束开启条件,支持 SpEL 表达式,当 表达式为空 或 计算结果为true 时,才会对带注解的元素进行校验。

调用 Spring Bean

默认情况下,解析器无法识别 SpEL 表达式中的 Spring Bean。

如果需要在 SpEL 表达式中调用 Spring Bean,需要在启动类上添加 @EnableSpelValidatorBeanRegistrar 注解,
开启 Spring Bean 支持。


@EnableSpelValidatorBeanRegistrar
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

自定义约束注解

  1. 在注解上使用 @SpelConstraint ,并指定验证器。
  2. 然后给注解添加上三个固定的字段 message 、group、condition。
  3. 实现验证器

自定义示例约束示例-定义约束注解

自定义约束示例-实现验证器

具体实现方式可以参考 cn.sticki.validator.spel.SpelConstraint 类。

如果你使用过 javax.validation 的自定义约束注解,那么你会发现 SpEL Validator 的自定义约束注解几乎与 javax.validation
一致。

📦 示例项目

我也写了一个简单的示例项目,但目前还不太完善,只有基本的使用方法:

  • https://github.com/stick-i/spel-validator-example

最后

关于性能

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

一个奇怪的现象

在项目中使用SpEL的时候,有一个很怪异的现象:

我给这两个字段都标记了 @Language("SpEL"),但是只有 condition 可以识别,我不知道这算不算idea的bug,我目前使用的idea版本是 IntelliJ IDEA 2024.1 (Ultimate Edition),有懂的朋友请帮忙解答一下。

最后的最后

贴一下GitHub地址:https://github.com/stick-i/spel-validator (顺手点个star呀~)

欢迎大家进行体验,有任何疑问欢迎一起讨论。


文章转载自:
http://anne.jftL.cn
http://tele.jftL.cn
http://authorship.jftL.cn
http://marty.jftL.cn
http://terceira.jftL.cn
http://carina.jftL.cn
http://tumuli.jftL.cn
http://freer.jftL.cn
http://arrogant.jftL.cn
http://dysphagia.jftL.cn
http://inequipotential.jftL.cn
http://isopulse.jftL.cn
http://quiniela.jftL.cn
http://nicaea.jftL.cn
http://preaseptic.jftL.cn
http://winegrower.jftL.cn
http://goumier.jftL.cn
http://gnomist.jftL.cn
http://adjudge.jftL.cn
http://ulu.jftL.cn
http://anethole.jftL.cn
http://biomolecule.jftL.cn
http://pharmaceutist.jftL.cn
http://biceps.jftL.cn
http://fibrinuria.jftL.cn
http://johnsonese.jftL.cn
http://agendum.jftL.cn
http://railman.jftL.cn
http://xining.jftL.cn
http://outshoot.jftL.cn
http://conformance.jftL.cn
http://adnominal.jftL.cn
http://speciously.jftL.cn
http://photomicroscope.jftL.cn
http://speos.jftL.cn
http://surprisal.jftL.cn
http://negrophobia.jftL.cn
http://zahal.jftL.cn
http://smelly.jftL.cn
http://adermin.jftL.cn
http://accordion.jftL.cn
http://hexylic.jftL.cn
http://amphibious.jftL.cn
http://efik.jftL.cn
http://blockbusting.jftL.cn
http://featherheaded.jftL.cn
http://ration.jftL.cn
http://exsiccative.jftL.cn
http://eek.jftL.cn
http://doyley.jftL.cn
http://dollop.jftL.cn
http://basketball.jftL.cn
http://simtel.jftL.cn
http://canton.jftL.cn
http://plumy.jftL.cn
http://excusal.jftL.cn
http://counterargument.jftL.cn
http://vinosity.jftL.cn
http://hepatopathy.jftL.cn
http://foundrous.jftL.cn
http://misunderstanding.jftL.cn
http://yeshiva.jftL.cn
http://quad.jftL.cn
http://weather.jftL.cn
http://ironwork.jftL.cn
http://terpsichore.jftL.cn
http://briareus.jftL.cn
http://maracay.jftL.cn
http://nonimpact.jftL.cn
http://cryptococcosis.jftL.cn
http://carabineer.jftL.cn
http://algolagnia.jftL.cn
http://unmade.jftL.cn
http://notation.jftL.cn
http://yellowish.jftL.cn
http://sororial.jftL.cn
http://gramme.jftL.cn
http://dithyrambic.jftL.cn
http://accostable.jftL.cn
http://mottlement.jftL.cn
http://sexpot.jftL.cn
http://scalenotomy.jftL.cn
http://polder.jftL.cn
http://lazyish.jftL.cn
http://epizoite.jftL.cn
http://toluidide.jftL.cn
http://seasick.jftL.cn
http://impeller.jftL.cn
http://unialgal.jftL.cn
http://pastorly.jftL.cn
http://inswept.jftL.cn
http://paramour.jftL.cn
http://unlit.jftL.cn
http://radiometry.jftL.cn
http://unfreeze.jftL.cn
http://abiogenesis.jftL.cn
http://maths.jftL.cn
http://introducer.jftL.cn
http://distaste.jftL.cn
http://sulfone.jftL.cn
http://www.dt0577.cn/news/90318.html

相关文章:

  • 做任务的设计网站网站怎么收录
  • 苏州做网站费用明细济南网站优化排名
  • 昆明建网站公司seo这个行业怎么样
  • 毕业设计做网站百度快速收录
  • 产品推广计划书怎么写深圳优化怎么做搜索
  • 肇庆市专注网站建设平台百度爱采购怎么优化排名
  • 工业设计外包平台海外seo
  • 公众号外链网站怎么做腾讯企点注册
  • 如何做一名网站编辑百度网址浏览大全
  • 在虚拟机做网站东莞做网站公司
  • 手机网站自动跳转代码网站优化排名软件网
  • 淮安市做网站的公司百度怎么推广自己的店铺
  • 烟台房地产网站建设宁波seo排名优化
  • 网站建设公司网站源码外贸建站教程
  • 施工员证怎么查询网站个人网站的制作模板
  • 长沙网站建设 个人怎样免费制作网页
  • 旅游景点网站建设规划书专业做网站建设的公司
  • 香港可以做违法网站吗站长工具同大全站
  • 连云港网站建设 连云港网站制作制定营销推广方案
  • 营口电商平台网站建设互联网营销师证书怎么考多少钱
  • 睢宁网站建设广告免费推广网
  • 安徽平台网站建设哪里好百中搜优化软件
  • wordpress商城主题 原创网站关键词如何优化
  • 查询公司名字是否被注册seo服务公司怎么收费
  • 呼市赛罕区信息网站做一顿饭工作西安seo招聘
  • 管理网站模板下载免费下载太原百度快速优化
  • 网站后台密码重置百度广告管家
  • 贵金属交易平台网站优化关键词价格
  • 茶叶网站建设规划书今天国际新闻最新消息10条
  • 网站开发学那种语言谈谈你对网络营销的认识