Spring Modulith Verifier Skill
Use a domain-driven, modular layout: organize packages by business modules, not by technical layers.
Recommended Example Package Structure
dev.sivalabs.projectname/
├── Application # Main Spring Boot entrypoint class
├── shared/ # Cross-cutting concerns
│ ├── package-info.java
├── users/ # Users module (bounded context)
│ ├── config/ # Users module-specific config
│ ├── domain/ # Domain logic
│ │ ├── models/ # Domain models
│ │ │ ├── package-info.java
│ │ ├── exceptions/ # Domain custom Exception classes
│ │ │ ├── package-info.java
│ │ ├── {entities, repositories, mappers, services}
│ ├── api/ # REST API layer
│ │ ├── {controllers, DTOs} # REST controllers, Request, Response payload DTOs
│ └── UsersAPI.java # Module's public API (facade)
│
├── catalog/ # Catalog module
├── orders/ # Orders module
└── config/ # Global Configuration
└── WebMvcConfig.java
└── SecurityConfig.java
└── WebSecurityConfig.java
└── GlobalExceptionHandler.java
Explanation of the above package structure:
Application.java: The main Spring Boot entry point class annotated with @SpringBootApplication. Contains the main() method that bootstraps the application.
shared/: Contains cross-cutting concerns and utilities shared across multiple modules (e.g., common utilities, shared DTOs, base classes, custom annotations).
{module}/ (e.g., users/, catalog/, orders/): Each business module represents a bounded context and contains:
config/: Module-specific configuration classes annotated with @Configuration for beans, properties, or third-party integrations relevant only to this module.
domain/: Core business logic layer containing:
- models/: Domain model classes (Command, Query objects, Enums, Value Objects, Result objects, etc) representing business concepts (not JPA entities). These are pure Java objects that encapsulate business rules.
- exceptions/: Domain specific custom Exception classes.
- entities: JPA entity classes annotated with
@Entity that map to database tables. These should not be public to prevent direct instantiation and ensure encapsulation.
- repositories: Spring Data JPA repository interfaces extending
JpaRepository or CrudRepository for data access. These should not be public.
- mappers: Mapper classes/interfaces (e.g., MapStruct mappers) for converting between entities, domain models, and DTOs. These should not be
public.
- services: Service classes annotated with
@Service containing business logic, converting beans using mappers, transaction management, and orchestration of repository calls.
api/: REST API layer containing:
- controllers: REST controller classes annotated with
@RestController that handle HTTP requests, validate input, and delegate to services.
- DTOs: Data Transfer Objects including request payloads (data coming from clients) and response payloads (data sent to clients).
{Module}API.java: A facade class that serves as the module's public API, delegating calls to services, exposing only what other modules should access while hiding internal implementation details.
config/: Global application-wide configuration classes including:
- WebMvcConfig.java: MVC configuration (CORS, interceptors, formatters).
- SecurityConfig.java: Spring Security configuration for authentication and authorization.
- GlobalExceptionHandler.java: Centralized exception handling using
@RestControllerAdvice for consistent error responses.
Visibility Modifiers
Default to minimum necessary visibility. Only expose what other modules or layers genuinely need.
| Component |
Class |
Constructor |
Methods |
| Controller |
package-private |
package-private |
package-private |
| Service |
public |
package-private |
public |
| Repository |
package-private (interface) |
— |
— |
| Entity |
package-private |
protected |
public |
| DTO / record |
public or package-private |
— |
— |
| Module API facade |
public |
package-private |
public |
| Request/Response records |
package-private |
— |
— |
| Config/Exception handler |
package-private |
— |
— |
Naming Conventions
| Type |
Convention |
Example |
| Entities |
*Entity |
UserEntity, AddressEntity |
| Value Objects |
Domain name (record) |
Email, UserCode, UserId |
| Commands |
*Cmd |
CreateUserCmd, UpdateAddressCmd |
| Command Response |
*Result |
LoginResult, RegistrationResult |
| DTOs |
*Dto |
UserDto, AddressDto |
| HTTP Request |
*Request |
CreateUserRequest, CreateAddressRequest |
| HTTP Response |
*Response |
CreateUserResponse, CreateAddressResponse |
| Repositories |
*Repository |
UserRepository, AddressBookRepository |
| Services |
*Service |
UserService, AddressBookService |
| Domain Exceptions |
*Exception |
InvalidUserCreationException, UserCancellationException |
| Module API |
*API |
UsersAPI |
1---2name: spring-modulith-verifier3description: Verifies whether code follows Spring Modulith code structure or not. Show list of violations along with recommendations on how to fix them. Use this skill: * When reviewing Spring Boot applications which uses Spring Modulith * When verifying whether Spring Boot application code follows Spring Modulith package structure4---5
6# Spring Modulith Verifier Skill
7
8Use a **domain-driven, modular layout**: organize packages by **business modules**, not by technical layers.
9
10### Recommended Example Package Structure
11
12```
13dev.sivalabs.projectname/
14├── Application # Main Spring Boot entrypoint class
15├── shared/ # Cross-cutting concerns
16│ ├── package-info.java
17├── users/ # Users module (bounded context)
18│ ├── config/ # Users module-specific config
19│ ├── domain/ # Domain logic
20│ │ ├── models/ # Domain models
21│ │ │ ├── package-info.java
22│ │ ├── exceptions/ # Domain custom Exception classes
23│ │ │ ├── package-info.java
24│ │ ├── {entities, repositories, mappers, services}
25│ ├── api/ # REST API layer
26│ │ ├── {controllers, DTOs} # REST controllers, Request, Response payload DTOs
27│ └── UsersAPI.java # Module's public API (facade)
28│
29├── catalog/ # Catalog module
30├── orders/ # Orders module
31└── config/ # Global Configuration
32 └── WebMvcConfig.java
33 └── SecurityConfig.java
34 └── WebSecurityConfig.java
35 └── GlobalExceptionHandler.java
36```
37
38Explanation of the above package structure:
39
40- **Application.java**: The main Spring Boot entry point class annotated with `@SpringBootApplication`. Contains the `main()` method that bootstraps the application.
41
42- **shared/**: Contains cross-cutting concerns and utilities shared across multiple modules (e.g., common utilities, shared DTOs, base classes, custom annotations).
43
44- **{module}/** (e.g., users/, catalog/, orders/): Each business module represents a bounded context and contains:
45
46 - **config/**: Module-specific configuration classes annotated with `@Configuration` for beans, properties, or third-party integrations relevant only to this module.
47
48 - **domain/**: Core business logic layer containing:
49 - **models/**: Domain model classes (Command, Query objects, Enums, Value Objects, Result objects, etc) representing business concepts (not JPA entities). These are pure Java objects that encapsulate business rules.
50 - **exceptions/**: Domain specific custom Exception classes.
51 - **entities**: JPA entity classes annotated with `@Entity` that map to database tables. These should not be `public` to prevent direct instantiation and ensure encapsulation.
52 - **repositories**: Spring Data JPA repository interfaces extending `JpaRepository` or `CrudRepository` for data access. These should not be `public`.
53 - **mappers**: Mapper classes/interfaces (e.g., MapStruct mappers) for converting between entities, domain models, and DTOs. These should not be `public`.
54 - **services**: Service classes annotated with `@Service` containing business logic, converting beans using mappers, transaction management, and orchestration of repository calls.
55
56 - **api/**: REST API layer containing:
57 - **controllers**: REST controller classes annotated with `@RestController` that handle HTTP requests, validate input, and delegate to services.
58 - **DTOs**: Data Transfer Objects including request payloads (data coming from clients) and response payloads (data sent to clients).
59
60 - **{Module}API.java**: A facade class that serves as the module's public API, delegating calls to services, exposing only what other modules should access while hiding internal implementation details.
61
62- **config/**: Global application-wide configuration classes including:
63 - **WebMvcConfig.java**: MVC configuration (CORS, interceptors, formatters).
64 - **SecurityConfig.java**: Spring Security configuration for authentication and authorization.
65 - **GlobalExceptionHandler.java**: Centralized exception handling using `@RestControllerAdvice` for consistent error responses.
66
67### Visibility Modifiers
68
69Default to **minimum necessary visibility**. Only expose what other modules or layers genuinely need.
70
71| Component | Class | Constructor | Methods |
72|--------------------------|-----------------------------|-----------------|-----------------|
73| Controller | package-private | package-private | package-private |
74| Service | `public` | package-private | `public` |
75| Repository | package-private (interface) | — | — |
76| Entity | package-private | protected | `public` |
77| DTO / record | `public` or package-private | — | — |
78| Module API facade | `public` | package-private | `public` |
79| Request/Response records | package-private | — | — |
80| Config/Exception handler | package-private | — | — |
81
82
83### Naming Conventions
84
85| Type | Convention | Example |
86|-----------------------|----------------------|-------------------------------------------------------------|
87| **Entities** | `*Entity` | `UserEntity`, `AddressEntity` |
88| **Value Objects** | Domain name (record) | `Email`, `UserCode`, `UserId` |
89| **Commands** | `*Cmd` | `CreateUserCmd`, `UpdateAddressCmd` |
90| **Command Response** | `*Result` | `LoginResult`, `RegistrationResult` |
91| **DTOs** | `*Dto` | `UserDto`, `AddressDto` |
92| **HTTP Request** | `*Request` | `CreateUserRequest`, `CreateAddressRequest` |
93| **HTTP Response** | `*Response` | `CreateUserResponse`, `CreateAddressResponse` |
94| **Repositories** | `*Repository` | `UserRepository`, `AddressBookRepository` |
95| **Services** | `*Service` | `UserService`, `AddressBookService` |
96| **Domain Exceptions** | `*Exception` | `InvalidUserCreationException`, `UserCancellationException` |
97| **Module API** | `*API` | `UsersAPI` |