{"id":28325086,"url":"https://github.com/manojsatna31/domain-specification-lib","last_synced_at":"2026-05-08T15:45:44.534Z","repository":{"id":292025567,"uuid":"977465375","full_name":"manojsatna31/domain-specification-lib","owner":"manojsatna31","description":"Custom OpenAPI Code Generation for Spring Boot \u0026 Jakarta EE","archived":false,"fork":false,"pushed_at":"2025-05-24T03:09:29.000Z","size":3129,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-24T04:20:54.511Z","etag":null,"topics":["custome-code-generator","java","opanapi","openapi-documentation","openapi-generator","openapi-spec","openapi-specification","openapi3","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Mustache","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/manojsatna31.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-04T09:19:16.000Z","updated_at":"2025-05-24T03:09:33.000Z","dependencies_parsed_at":"2025-05-07T19:26:32.801Z","dependency_job_id":"0a37bd5e-3a42-40fc-a182-b7cd36dbea46","html_url":"https://github.com/manojsatna31/domain-specification-lib","commit_stats":null,"previous_names":["manojsatna31/domain-specification-lib"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manojsatna31%2Fdomain-specification-lib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manojsatna31%2Fdomain-specification-lib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manojsatna31%2Fdomain-specification-lib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manojsatna31%2Fdomain-specification-lib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/manojsatna31","download_url":"https://codeload.github.com/manojsatna31/domain-specification-lib/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manojsatna31%2Fdomain-specification-lib/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259184739,"owners_count":22818267,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["custome-code-generator","java","opanapi","openapi-documentation","openapi-generator","openapi-spec","openapi-specification","openapi3","spring-boot"],"created_at":"2025-05-25T20:11:51.559Z","updated_at":"2026-05-08T15:45:39.514Z","avatar_url":"https://github.com/manojsatna31.png","language":"Mustache","funding_links":[],"categories":[],"sub_categories":[],"readme":"![img.png](images/img.png)\n# **Custom OpenAPI Code Generation for Spring Boot \u0026 Jakarta EE**\n![Custom OpenAPI Code Generation for Spring Boot \u0026 Jakarta EE](images/OpenAPI.png)\n\nThis project provides a streamlined approach to customizing **OpenAPI Generator** templates, allowing developers to optimize generated models with **mandatory annotations and imports**. Ideal for **Spring Boot 3, Jakarta EE**, and frameworks requiring **JSON serialization** and **Lombok automation**.\n\n# Domain Specification Library (`domain-specification-lib`)\n\n## Overview\nThe **Domain Specification Library** (`domain-specification-lib`) serves as a centralized repository for **interchange model definitions** and **API specifications**. It integrates **automatic Java POJO generation**, ensuring seamless API development while maintaining structured interfaces.\n\nThis library leverages **OpenAPI Code Generator** to automate Java model and API stub creation, optimizing development workflows and enhancing consistency.\n\n---\n\n## Features\n- 📌 **Centralized Model Management**\n    - Stores API specifications and data models in a structured format.\n- 🚀 **Automatic Code Generation**\n    - Generates Java POJOs and API interfaces from OpenAPI definitions.\n- ⚙️ **Spring Boot \u0026 Jakarta EE Compatibility**\n    - Supports modern frameworks with Jakarta EE and Spring Boot 3.\n- 🔗 **Custom OpenAPI Generator Templates**\n    - Provides fine-tuned customization for API and model generation.\n- 📈 **Optimized API Development Workflow**\n    - Reduces manual coding efforts with automated model creation.\n- 🔍 **Validation \u0026 Documentation**\n    - Supports Swagger-based validation with auto-generated documentation.\n- ♻️ **Modular Architecture**\n    - Includes multi-module support for scalable development.\n\n---\n\n## Project Structure\n\n```xml\n  \u003cgroupId\u003ecom.technext.spec\u003c/groupId\u003e\n  \u003cartifactId\u003edomain-specification-lib\u003c/artifactId\u003e\n  \u003cversion\u003e1.0-SNAPSHOT\u003c/version\u003e\n  \u003cpackaging\u003epom\u003c/packaging\u003e\n```\nThis repository follows a modular structure:\n```xml\n\u003cmodules\u003e\n    \u003cmodule\u003eemployee-info\u003c/module\u003e\n\u003c/modules\u003e\n```\n## Dependencies\nThe library incorporates several essential dependencies for robust API modeling and implementation:\n```xml\n\u003cdependencies\u003e\n    \u003c!-- Jakarta EE \u0026 Servlet APIs --\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003ejakarta.servlet\u003c/groupId\u003e\n        \u003cartifactId\u003ejakarta.servlet-api\u003c/artifactId\u003e\n        \u003cversion\u003e6.1.0\u003c/version\u003e\n        \u003cscope\u003eprovided\u003c/scope\u003e\n    \u003c/dependency\u003e\n\n    \u003c!-- Swagger \u0026 OpenAPI --\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.swagger.core.v3\u003c/groupId\u003e\n        \u003cartifactId\u003eswagger-models\u003c/artifactId\u003e\n        \u003cversion\u003e2.2.30\u003c/version\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.swagger.core.v3\u003c/groupId\u003e\n        \u003cartifactId\u003eswagger-annotations\u003c/artifactId\u003e\n        \u003cversion\u003e2.2.19\u003c/version\u003e\n    \u003c/dependency\u003e\n\n    \u003c!-- Spring Boot \u0026 Feign Client --\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\n        \u003cartifactId\u003espring-cloud-starter-openfeign\u003c/artifactId\u003e\n        \u003cversion\u003e4.2.1\u003c/version\u003e\n    \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n## OpenAPI Code Generation\nThis project utilizes the OpenAPI Generator Maven Plugin to automate API stub generation and model creation.\n\n### Configuration:\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003eorg.openapitools\u003c/groupId\u003e\n    \u003cartifactId\u003eopenapi-generator-maven-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e${openapi-generator.version}\u003c/version\u003e\n    \u003cexecutions\u003e\n        \u003cexecution\u003e\n            \u003cid\u003eapi-code-generator\u003c/id\u003e\n            \u003cgoals\u003e\n                \u003cgoal\u003egenerate\u003c/goal\u003e\n            \u003c/goals\u003e\n            \u003cconfiguration\u003e\n                \u003cskip\u003e${api.build.skip}\u003c/skip\u003e\n                \u003cinputSpec\u003e${project.basedir}/src/main/resources/${model}-api.yml\u003c/inputSpec\u003e\n                \u003coutput\u003e${project.build.directory}/generated-source/openapi\u003c/output\u003e\n                \u003cgeneratorName\u003espring\u003c/generatorName\u003e\n                \u003capiPackage\u003e${model.package}.${model}.${model.version}.api\u003c/apiPackage\u003e\n                \u003cmodelPackage\u003e${model.package}.${model}.${model.version}.model\u003c/modelPackage\u003e\n                \u003clibrary\u003espring-cloud\u003c/library\u003e\n                \u003cgenerateSupportingFiles\u003etrue\u003c/generateSupportingFiles\u003e\n            \u003c/configuration\u003e\n        \u003c/execution\u003e\n    \u003c/executions\u003e\n\u003c/plugin\u003e\n```\n\n### Key Customizations:\n- Custom template directory for Java Spring generation.\n- Supports Spring Boot 3, Jakarta EE, and Delegate Patterns.\n- Enables Lombok annotations for generated models:\n  ```xml\n  \u003cadditionalModelTypeAnnotations\u003e\n    @lombok.Data\n    @lombok.NoArgsConstructor\n    @lombok.AllArgsConstructor\n    @JsonInclude(JsonInclude.Include.NON_NULL)\n    @JsonIgnoreProperties(ignoreUnknown = true)\n  \u003c/additionalModelTypeAnnotations\u003e\n  ``` \n\n## Build \u0026 Deployment Instructions\n#### 🛠️ Building the Project:\nTo build the domain-specification-lib, run the following Maven command:\n```bash\nmvn clean install\n```\n\n#### 📦 Generated Artifacts\nAfter building the project, the generated API models and specifications will be available in:\n```bash\ntarget/generated-source/openapi\n```\n\n#### 🏗️ Customizing API Generation\nModify the configuration settings in pom.xml to:\n- Enable or disable OpenAPI validation checks.\n- Define custom API packages for model definitions.\n- Adjust generated documentation settings.\n\n---\n# **Customizing OpenAPI Code Generation**\n\n### **Enhancing API Code with Custom Templates**\n\nWhen working with **OpenAPI Generator**, ensuring consistency and maintainability in generated models is key. Here’s how to enforce mandatory annotations and imports efficiently.\n\n---\n\n### **Customization Goals**\nEvery model must include:\n1) **Mandatory Annotations**\n   - `@JsonInclude(JsonInclude.Include.NON_NULL)`\n   - `@JsonIgnoreProperties(ignoreUnknown = true)`\n   - Lombok annotations: `@Getter`, `@Setter`, `@SuperBuilder`, `@NoArgsConstructor`, `@AllArgsConstructor`\n\n2) **Mandatory Imports**\n   - `import com.fasterxml.jackson.annotation.*`\n   - `import lombok.*`\n   - `import lombok.experimental.SuperBuilder`\n\n---\n\n## **Approach: Template-Based Customization**\nOpenAPI Generator provides two ways to tailor code generation:\n\n1. **Custom Generator Development** – Ideal for adding support for new frameworks or languages.\n2. **Template Replacement** – A lightweight approach that **refines the structure** without modifying the core generator.\n\nSince we only need to tweak specific templates, we’ll focus on **option two**.\n\n---\n\n### **Locating the Right Template**\nFor [**Spring-based projects**](https://github.com/OpenAPITools/openapi-generator/tree/v7.13.0/modules/openapi-generator/src/main/resources/JavaSpring), the relevant folder is:\n\n```bash\nJavaSpring/\n```\nWithin this directory, you’ll find **Mustache templates** defining the model structure.\n\nKey templates to modify:\n- **`model.mustache`** – Controls custom imports.\n- **`pojo.mustache`** – Defines class annotations.\n\n---\n\n### **Implementing Custom Templates**\n\n---\n#### **Step 1: Define Custom Templates**\n1) **pojoCustomAnnotations.mustache**\n    ```bash\n    // Custom JSON Annotation\n    @JsonInclude(JsonInclude.Include.NON_NULL)\n    @JsonIgnoreProperties(ignoreUnknown = true)\n    \n    // Lombok Annotations\n    @Getter\n    @Setter\n    @SuperBuilder\n    ```\n\n2) **pojoCustomImports.mustache**\n    ```bash\n    // Custom Imports\n    {{#jackson}}\n    import com.fasterxml.jackson.annotation.JsonTypeName;\n    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n    import com.fasterxml.jackson.annotation.JsonInclude;\n    import com.fasterxml.jackson.annotation.JsonRawValue;\n    {{/jackson}}\n    \n    // Lombok Imports\n    import lombok.*;\n    import lombok.experimental.SuperBuilder;\n    ```\n---\n#### **Step 2: Update Existing Templates**\n1) **Modify model.mustache:**\n    ```bash\n    package {{package}};\n    {{\u003epojoCustomImports}}\n    // Other unchanged properties omitted...\n    ```\n2) **Modify pojo.mustache:**\n    ```bash\n    // Other unchanged properties omitted...\n    {{{vendorExtensions.x-class-extra-annotation}}}\n    {{/vendorExtensions.x-class-extra-annotation}}\n    {{\u003epojoCustomAnnotations}}\n    public {{\u003esealed}} class {{classname}} {{#parent}} extends {{{parent}}} {{/parent}} \n    {{^parent}}{{#hateoas}} extends RepresentationModel\u003c{{classname}}\u003e {{/hateoas}}{{/parent}}\n    {{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}\n    {{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {{\u003epermits}} {\n    {{#serializableModel}}\n    // Other unchanged properties omitted...\n    ```\n---\n#### **Step 3: Update Maven Configuration**\nModify pom.xml to reference the custom templates:\n```xml\n\u003c!-- Points to a custom template directory --\u003e\n\u003ctemplateResourcePath\u003e${project.basedir}/../templates/JavaSpring\u003c/templateResourcePath\u003e\n```\n---\n#### **Step 4:Run the Maven build to generate code**\n```bash\nmvn clean install\n```\n---\n[!NOTE]\nComment out the additionalModelTypeAnnotations tag in pom.xml\n```xml\n\u003cadditionalModelTypeAnnotations\u003e\n    @lombok.Data\n    @lombok.NoArgsConstructor\n    @lombok.AllArgsConstructor\n    @JsonInclude(JsonInclude.Include.NON_NULL)\n    @JsonIgnoreProperties(ignoreUnknown = true)\n \u003c/additionalModelTypeAnnotations\u003e\n```\n---\n#### **Final Thoughts**\nCustomizing OpenAPI Generator templates is a smart approach to ensuring consistency, improving code maintainability, and seamlessly integrating with frameworks like Spring Boot 3 and Jakarta EE.\n\n---\n#### More on [Custome Annotation](CUSTOME-ANNOTATION.md)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanojsatna31%2Fdomain-specification-lib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmanojsatna31%2Fdomain-specification-lib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanojsatna31%2Fdomain-specification-lib/lists"}