首页 文章 精选 留言 我的

精选列表

搜索[图片预览],共10000篇文章
优秀的个人博客,低调大师

SpEL Validator 预览版发布

前言 大家好,我是阿杆,不是阿轩。 参数校验这个东西,很多情况下都是比较简单的,用 @NotNull、@Size 等注解就可以解决绝大多数场景,但也有一些场景是这些基本注解解决不了的,只能用一些其他的方式处理,这样就导致参数校验变成了多层,其实是不利于代码维护的。 于是乎,我写了一套几乎可以满足任何场景的参数校验组件,名为SpEL Validator ,安利给大家。 GitHub:https://github.com/stick-i/spel-validator 官方文档:https://spel-validator.sticki.cn/ 💡 它解决了什么问题? 枚举值字段校验: @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.2.0-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 { @NotNull private 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 会有一定的性能损耗。 开启约束校验 需要满足以下两个条件,才会对带注解的元素进行校验: 在接口参数上使用 @Valid 或 @Validated 注解 在实体类上使用 @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); } } 自定义约束注解 在注解上使用 @SpelConstraint ,并指定验证器。 然后给注解添加上三个固定的字段 message 、group、condition。 实现验证器 具体实现方式可以参考官方文档。 如果你使用过 javax.validation 的自定义约束注解,那么你会发现 SpEL Validator 的自定义约束注解几乎与 javax.validation 一致。 📦 示例项目 我也写了一个简单的示例项目,有一些基本的使用方法: https://github.com/stick-i/spel-validator-example 最后 贴一下GitHub地址:https://github.com/stick-i/spel-validator (顺手点个star呀~) 欢迎大家进行体验,有任何疑问欢迎一起讨论。

优秀的个人博客,低调大师

🔥🔥🔥超级 ORM 框架 mybatis-mp 预览版 1.6.8-rc 发布

官网 :https://mybatis-mp.cn 更新: 1: 增加sql buidler构建干预口,让你可以更好的扩展sql 为什么推荐 mybatis-mp ?: mybatis-mp 是一款超级强大的 ORM 框架 1:可多表 join(不再只能单表了) 2:良好 resultMap 结果映射能力(不怕映射错误了) 3:良好的扩展能力:orm+sql 模板 (让 ORM 框架不再死板,扩展性极强) 4:就算 xml 也不用再增加什么插件了,自带 xml 分页 5:强大的各种数据库适配,可在一套代码中 实现多个数据库适配;真正的 ORM hibernate 都做不到 6:极简的 api 设计,让开发者 不再迷糊 7:还很多很多独特优良的设计,只有前往体验,才能感受了;不相信可以试试!!! 1.单表 +@Fetch 注解 + fetchFilter 方法 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; private String password; private Integer roleId; private LocalDateTime create_time; @Fetch(source = SysUser.class, property = "roleId", target = SysRole.class, targetProperty = "id") private List<SysRoleVo> sysRoles; } List<SysUserVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .fetchFilter(SysUserVO::getRoles,where->where.eq(SysRole::getStatus,1)) .returnType(SysUserVO.class) .list(); fetchFilter 方法是对 @Fetch 注解的增强,没有特殊要求一般,可忽略 2. 单表查询 SysUser sysUser = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .get(); 3.VO 映射 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; } SysUserVO sysUserVO = QueryChain.of(sysUserMapper) .eq(SysUser::getId, 1) .eq(SysUser::getUserName,'admin') .returnType(SysUserVO.class) .list(); 4. join 查询 @Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; //字段名字不一样时 @ResultEntityField(property = "password") private String pwd; //映射一个对象 1对1 @NestedResultEntity(target = SysRole.class) prviate SysRole sysRole; //映射多个对象 1对多 @NestedResultEntity(target = SysRole.class) prviate List<SysRole> sysRoles; } List<SysUserRoleVO> list = QueryChain.of(sysUserMapper) .from(SysUser.class) .join(SysUser.class, SysRole.class) .returnType(SysUserRoleVO.class) .list(); 还有很多很多超级方便有趣的写法,欢迎大家来使用https://mybatis-mp.cn 例如: 1 . 多表 join A 内嵌 B B 内嵌 C 都可以 2 . 不使用 join 使用 @Fetch 注解 + fetchFilter 方法实现 将 A JOIN B 变成 query A + query B 3 . 使用 @Paging 注解 实现你的 xml 自动分页 4 . 使用 SQL 模板,让你 ORM 更简单更容易扩展,再也不怕被框架限制了

优秀的个人博客,低调大师

Zadig v1.0.0 预览版发布,开源分布式持续交付产品

Zadig v1.0.0 已经发布,此版本更新内容包括: 提升 zadig 安装脚本的稳定性和成功率 以下安装环境已经过测试: Existing Cluster Vendor Kubernetes Version Test Result Ali ACK 1.16.9 pass 1.18.8 pass Tencent TKE 1.18.4 pass 1.16.3 pass 1.14.3 pass 1.12.4 pass HuaWei CCE 1.19.8 pass 1.17.17 pass Rancher 1.18 pass 1.20 pass Elastic Compute Service Vendor OS Version Test Result Ali ECS Ubuntu16.04 pass Ubuntu18.04 pass Ubuntu20.04 pass CentOS7.4 pass CentOS8.3 pass Tencent CVM Ubuntu16.04 pass Ubuntu18.04 pass Ubuntu20.04 pass CentOS8.2 pass HuaWei ECS Ubuntu16.04 pass Ubuntu18.04 pass Ubuntu20.04 pass CentOS7.6 pass CentOS8.2 pass Zadig 是一款面向开发者设计的云原生持续交付(Continuous Delivery)产品,具备高可用 CI/CD 能力,提供云原生运行环境,支持开发者本地联调、微服务并行构建和部署、集成测试等。Zadig 不改变现有流程,无缝集成 Github/Gitlab、Jenkins、多家云厂商等,运维成本极低。 详情查看:https://gitee.com/koderover/zadig/releases/v1.0.0

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册