用途
本技能为 Spring Boot 与 Quarkus 服务中的 Java(17+)代码提供可读、可维护的编码规范。适用于以下场景:
- 在 Spring Boot 或 Quarkus 项目中编写或评审 Java 代码
- 统一命名、不可变性或异常处理约定
- 使用 record、密封类或模式匹配(Java 17+)
- 审查 Optional、Streams 或泛型的使用
- 规划包结构与项目布局
- [QUARKUS] 处理 CDI 作用域、Panache 实体或响应式管道
框架识别
应用规范前,先根据构建文件判断框架:
- 构建文件包含 quarkus → 应用 [QUARKUS] 约定
- 构建文件包含 spring-boot → 应用 [SPRING] 约定
- 两者都未检测到 → 只应用共享约定
核心原则
- 清晰优先于炫技
- 默认不可变;尽量减少共享可变状态
- 快速失败,抛出有意义的异常
- 命名与包结构保持一致
- [QUARKUS] 优先构建期处理而非运行期处理;尽量避免运行期反射
主要能力
命名
- 类/record 使用 PascalCase;方法/字段使用 camelCase;常量使用 UPPER_SNAKE_CASE
- [QUARKUS] JAX-RS 资源命名为 *Resource,而非 *Controller
- [SPRING] REST 控制器命名为 *Controller
不可变性
- 优先使用 record 和 final 字段;只提供 getter,不提供 setter
- [QUARKUS] Panache active-record 实体使用 public 字段(Quarkus 约定,构建期生成访问器)
- [QUARKUS] Panache MongoDB 实体使用 @MongoEntity 注解
Optional 用法
- find* 方法返回 Optional
- 使用 map/flatMap 而非 get(),配合 orElseThrow 抛出领域异常
Streams 最佳实践
- 用 Streams 做转换,保持管道简短
- 避免复杂嵌套 Streams;为清晰起见优先使用循环
依赖注入
- [SPRING] 优先构造器注入,避免字段上的 @Autowired
- [QUARKUS] 支持构造器注入;包级私有字段注入可接受(避免代理问题)
- [QUARKUS] 需要拦截或懒初始化时避免 @Singleton,改用 @ApplicationScoped
响应式模式 [QUARKUS]
- 响应式端点返回 Uni/Multi
- 使用非阻塞管道组合(chain)
- 避免在 Uni/Multi 管道内进行阻塞调用
- 避免对共享 Uni 多次订阅;使用 Uni.memoize()
异常
- 领域错误使用非受检异常;技术异常包装上下文
- 创建领域专属异常(如 MarketNotFoundException)
- 避免宽泛的 catch (Exception ex),除非集中重新抛出或记录
- 集中式异常处理:[SPRING] 使用 @RestControllerAdvice;[QUARKUS] 使用 ExceptionMapper 或 @ServerExceptionMapper
泛型与类型安全
- 避免原始类型;声明泛型参数
- 可复用工具优先使用有界泛型
项目结构
- [SPRING] 包结构:config、controller、service、repository、domain、dto、util;资源文件 application.yml;测试镜像 main
- [QUARKUS] 包结构:config、resource、service、repository、domain、dto、util、mapper;资源文件 application.properties(支持 YAML 需 quarkus-config-yaml)、import.sql;测试镜像 main
格式与风格
- 统一使用 2 或 4 空格缩进(遵循项目标准)
- 每个文件一个公共顶层类型
- 方法保持短小专注;提取辅助方法
- 成员顺序:常量、字段、构造器、公共方法、protected、private
应避免的代码坏味道
- 长参数列表 → 使用 DTO/构建器
- 深层嵌套 → 提前返回
- 魔法数字 → 命名常量
- 静态可变状态 → 优先依赖注入
- 静默 catch 块 → 记录并处理或重新抛出
- [QUARKUS] 在需要 @ApplicationScoped 时误用 @Singleton——破坏代理与拦截
- [QUARKUS] 混用 quarkus-resteasy-reactive 与 quarkus-resteasy(经典)——选定一种栈
- [QUARKUS] 同一限界上下文中混用 Panache active-record 与 repository 模式——选定一种
日志
- [SPRING] 使用 SLF4J:LoggerFactory.getLogger,log.info("fetch_market slug={}", slug)
- [QUARKUS] 使用 JBoss Logging:Logger.getLogger,log.infof("fetch_market slug=%s", slug)
- [QUARKUS] 替代方案:@Inject Logger log(CDI 注入,作用域为声明类)
空值处理
- 仅在不可避免时接受 @Nullable;否则使用 @NonNull
- 对输入使用 Bean Validation(@NotNull、@NotBlank)
- [QUARKUS] 在 @BeanParam、@RestForm 和请求体参数上应用 @Valid
配置
- [SPRING] 使用 @ConfigurationProperties
- [QUARKUS] 使用 @ConfigMapping(类型安全、构建期校验)或 @ConfigProperty
测试期望
共享:JUnit 5 + AssertJ;Mockito 模拟;避免部分模拟;测试确定性,无隐藏 sleep。
- [SPRING] @WebMvcTest 用于控制器切片,@DataJpaTest 用于仓库切片,@SpringBootTest 保留给完整集成测试,@MockBean 替换 bean
- [QUARKUS] 纯 JUnit 5 + Mockito 用于单元测试(不用 @QuarkusTest),@QuarkusTest 保留给 CDI 集成测试,@InjectMock 替换 CDI bean,Dev Services 用于数据库/Kafka/Redis,@QuarkusTestResource 管理自定义外部服务生命周期
使用方式
该技能以规范文档形式提供,包含具体代码示例(PASS/FAIL 标注),供编写或评审 Java 代码时参照执行。技能会先读取构建文件识别框架,再应用对应约定。
适用场景
- Spring Boot 或 Quarkus 服务的日常开发与代码评审
- 团队统一 Java 编码风格与项目结构
- 引入 Java 17+ 新特性(record、密封类、模式匹配)时的规范参考
- Quarkus 响应式编程与 CDI 作用域的正确使用
限制
- 仅覆盖 Java 17+ 的 Spring Boot 与 Quarkus 服务,其他框架或语言暂未提供
- 具体版本兼容性、安装方式、收费与价格信息暂未提供
- 示例中的类名与包名仅为演示,实际项目需按自身命名调整