Your goal is to help me write high-quality, idiomatic Spring Boot applications using Kotlin.
Project Setup & Structure
Build Tool: Use Maven (pom.xml) or Gradle (build.gradle) with the Kotlin plugins (kotlin-maven-plugin or org.jetbrains.kotlin.jvm).
Kotlin Plugins: For JPA, enable the kotlin-jpa plugin to automatically make entity classes open without boilerplate.
Starters: Use Spring Boot starters (e.g., spring-boot-starter-web, spring-boot-starter-data-jpa) as usual.
Package Structure: Organize code by feature/domain (e.g., com.example.app.order, com.example.app.user) rather than by layer.
Dependency Injection & Components
Primary Constructors: Always use the primary constructor for required dependency injection. It's the most idiomatic and concise approach in Kotlin.
Immutability: Declare dependencies as private val in the primary constructor. Prefer val over var everywhere to promote immutability.
Component Stereotypes: Use @Service, @Repository, and @RestController annotations just as you would in Java.
Configuration
Externalized Configuration: Use application.yml for its readability and hierarchical structure.
Type-Safe Properties: Use @ConfigurationProperties with data class to create immutable, type-safe configuration objects.
Profiles: Use Spring Profiles (application-dev.yml, application-prod.yml) to manage environment-specific configurations.
Secrets Management: Never hardcode secrets. Use environment variables or a dedicated secret management tool like HashiCorp Vault or AWS Secrets Manager.
Web Layer (Controllers)
RESTful APIs: Design clear and consistent RESTful endpoints.
Data Classes for DTOs: Use Kotlin data class for all DTOs. This provides equals(), hashCode(), toString(), and copy() for free and promotes immutability.
Validation: Use Java Bean Validation (JSR 380) with annotations (@Valid, @NotNull, @Size) on your DTO data classes.
Error Handling: Implement a global exception handler using @ControllerAdvice and @ExceptionHandler for consistent error responses.
Service Layer
Business Logic: Encapsulate business logic within @Service classes.
Statelessness: Services should be stateless.
Transaction Management: Use @Transactional on service methods. In Kotlin, this can be applied to class or function level.
Data Layer (Repositories)
JPA Entities: Define entities as classes. Remember they must be open. It's highly recommended to use the kotlin-jpa compiler plugin to handle this automatically.
Null Safety: Leverage Kotlin's null-safety (?) to clearly define which entity fields are optional or required at the type level.
Spring Data JPA: Use Spring Data JPA repositories by extending JpaRepository or CrudRepository.
Coroutines: For reactive applications, leverage Spring Boot's support for Kotlin Coroutines in the data layer.
Logging
Companion Object Logger: The idiomatic way to declare a logger is in a companion object.
companion object {
private val logger = LoggerFactory.getLogger(MyClass::class.java)
}
Parameterized Logging: Use parameterized messages (logger.info("Processing user {}...", userId)) for performance and clarity.
Testing
JUnit 5: JUnit 5 is the default and works seamlessly with Kotlin.
Idiomatic Testing Libraries: For more fluent and idiomatic tests, consider using Kotest for assertions and MockK for mocking. They are designed for Kotlin and offer a more expressive syntax.
Test Slices: Use test slice annotations like @WebMvcTest or @DataJpaTest to test specific parts of the application.
Testcontainers: Use Testcontainers for reliable integration tests with real databases, message brokers, etc.
Coroutines & Asynchronous Programming
suspend functions: For non-blocking asynchronous code, use suspend functions in your controllers and services. Spring Boot has excellent support for coroutines.
Structured Concurrency: Use coroutineScope or supervisorScope to manage the lifecycle of coroutines.
git-commitgithubExecute git commit with conventional commit message analysis, intelligent staging, and message generation. Use when user asks to commit changes, create a git commit, or mentions "/commit". Supports: (1) Auto-detecting type and scope from changes, (2) Generating conventional commit messages from diff, (3) Interactive commit with optional type/scope/description overrides, (4) Intelligent file staging for logical grouping46 k46 k instalaciones en skills.sh0
excalidraw-diagram-generatorgithubGenerate Excalidraw diagrams from natural language descriptions. Use when asked to "create a diagram", "make a flowchart", "visualize a process", "draw a system architecture", "create a mind map", or "generate an Excalidraw file". Supports flowcharts, relationship diagrams, mind maps, and system architecture diagrams. Outputs .excalidraw JSON files that can be opened directly in Excalidraw.30.8 k30.8 k instalaciones en skills.sh0
documentation-writergithubDiátaxis Documentation Expert. An expert technical writer specializing in creating high-quality software documentation, guided by the principles and structure of the Diátaxis technical documentation authoring framework.27.1 k27.1 k instalaciones en skills.sh0
prdgithubGenerate high-quality Product Requirements Documents (PRDs) for software systems and AI-powered features. Includes executive summaries, user stories, technical specifications, and risk analysis.23.6 k23.6 k instalaciones en skills.sh0
refactorgithubSurgical code refactoring to improve maintainability without changing behavior. Covers extracting functions, renaming variables, breaking down god functions, improving type safety, eliminating code smells, and applying design patterns. Less drastic than repo-rebuilder; use for gradual improvements.22 k22 k instalaciones en skills.sh0