Spring Modulith Verifier 是一个用于验证代码是否遵循 Spring Modulith 代码结构的技能。它采用领域驱动、模块化的布局方式,要求按业务模块组织包,而不是按技术分层组织。
用途
该技能用于检查代码是否符合 Spring Modulith 的模块化结构,并列出违规项以及如何修复的建议。
推荐的包结构
技能给出了一个推荐的示例包结构,以 dev.sivalabs.projectname 为根:
- Application:主 Spring Boot 入口类,带有 @SpringBootApplication 注解,包含启动应用的 main() 方法。
- shared/:包含跨模块共享的横切关注点和工具(如通用工具、共享 DTO、基类、自定义注解)。
- {module}/(例如 users/、catalog/、orders/):每个业务模块代表一个有界上下文,包含:
- config/:模块特定的配置类,带有 @Configuration 注解,用于该模块相关的 bean、属性或第三方集成。
- domain/:核心业务逻辑层,包含:
- models/:领域模型类(Command、Query 对象、枚举、值对象、Result 对象等),代表业务概念(不是 JPA 实体),是封装业务规则的纯 Java 对象。
- exceptions/:领域特定的自定义异常类。
- entities:带有 @Entity 注解的 JPA 实体类,映射到数据库表。这些不应是 public,以防止直接实例化并确保封装。
- repositories:继承 JpaRepository 或 CrudRepository 的 Spring Data JPA 仓库接口,用于数据访问。这些不应是 public。
- mappers:用于在实体、领域模型和 DTO 之间转换的映射器类/接口(例如 MapStruct 映射器)。这些不应是 public。
- services:带有 @Service 注解的服务类,包含业务逻辑、使用映射器转换 bean、事务管理以及编排仓库调用。
- api/:REST API 层,包含:
- controllers:带有 @RestController 注解的 REST 控制器类,处理 HTTP 请求、验证输入并委托给服务。
- DTOs:数据传输对象,包括请求负载(来自客户端的数据)和响应负载(发送给客户端的数据)。
- {Module}API.java:作为模块公共 API 的门面类,将调用委托给服务,只暴露其他模块应访问的内容,同时隐藏内部实现细节。
- config/:全局应用级配置类,包括:
- WebMvcConfig.java:MVC 配置(CORS、拦截器、格式化器)。
- SecurityConfig.java:用于认证和授权的 Spring Security 配置。
- GlobalExceptionHandler.java:使用 @RestControllerAdvice 进行集中异常处理,以提供一致的错误响应。
可见性修饰符
默认使用最小必要可见性,只暴露其他模块或层真正需要的内容。技能给出了各组件在类、构造器、方法上的可见性约定:
- Controller:类 package-private,构造器 package-private,方法 package-private。
- Service:类 public,构造器 package-private,方法 public。
- Repository:接口 package-private。
- Entity:类 package-private,构造器 protected,方法 public。
- DTO / record:public 或 package-private。
- Module API facade:类 public,构造器 package-private,方法 public。
- Request/Response records:package-private。
- Config/Exception handler:package-private。
命名约定
技能规定了以下命名约定:
- 实体:*Entity,例如 UserEntity、AddressEntity。
- 值对象:领域名称(record),例如 Email、UserCode、UserId。
- 命令:*Cmd,例如 CreateUserCmd、UpdateAddressCmd。
- 命令响应:*Result,例如 LoginResult、RegistrationResult。
- DTO:*Dto,例如 UserDto、AddressDto。
- HTTP 请求:*Request,例如 CreateUserRequest、CreateAddressRequest。
- HTTP 响应:*Response,例如 CreateUserResponse、CreateAddressResponse。
- 仓库:*Repository,例如 UserRepository、AddressBookRepository。
- 服务:*Service,例如 UserService、AddressBookService。
- 领域异常:*Exception,例如 InvalidUserCreationException、UserCancellationException。
- 模块 API:*API,例如 UsersAPI。
使用方式
资料中未提供具体的使用方式或安装命令。
适用场景
适用于使用 Spring Modulith 构建模块化单体应用的开发场景,帮助团队保持一致的代码组织方式,并检查代码是否符合推荐的模块化结构。
限制
资料中未提供关于限制的明确说明。