Skip to content

Instantly share code, notes, and snippets.

@mdasberg
Created September 1, 2022 19:34
Show Gist options
  • Save mdasberg/fd09090699bc125f89821cecefff72b1 to your computer and use it in GitHub Desktop.
Save mdasberg/fd09090699bc125f89821cecefff72b1 to your computer and use it in GitHub Desktop.

Openapi-generator with Lombok

Directory structure

  • templates
    • JavaSpring
      • beanValidation.mustache
      • model.mustache
      • pojo.mustache

Gradle configuration: build.gradle

plugins {
    // Openapi generator
    id 'org.openapi.generator' version '6.0.0'
    // Spotless for formatting
    id "com.diffplug.spotless" version "6.10.0"
}

openApiGenerate {
    generatorName = "spring"
    //https://github.com/OpenAPITools/openapi-generator/blob/master/docs/generators/spring.md
    configOptions = [
            interfaceOnly       : "true",
            skipDefaultInterface: "true",
            delegatePattern     : "true",
            openApiNullable     : "false",
            jackson             : "false"
    ]

    typeMappings = [
            // We want to use Instant
            OffsetDateTime: "Instant"
    ]
    importMappings = [
            "java.time.OffsetDateTime": "java.time.Instant",
    ]

    apiPackage = "my.domain.api"
    modelPackage = "my.domain.dto"
    templateDir = "$rootDir/templates/JavaSpring"
    library = "spring-cloud"
    inputSpec = "$rootDir/api/openapi.json".toString()
    outputDir = "$buildDir/generated-source".toString()
}

task generate(type: GradleBuild) {
    tasks = [
            'openApiGenerate',
            'spotlessApply'
    ]
}
{{#required}}{{#isContainer}}@NotEmpty{{/isContainer}}{{^isContainer}}{{^isReadOnly}}@NotNull{{/isReadOnly}}{{/isContainer}}{{/required}}
{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}}@Valid{{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{^isContainer}}{{^isPrimitiveType}}@Valid{{/isPrimitiveType}}{{/isContainer}}{{>beanValidationCore}}
package {{package}};
{{#imports}}import {{import}};
{{/imports}}
import javax.validation.Valid;
import javax.validation.constraints.*;
import io.swagger.v3.oas.annotations.media.Schema;
{{#withXml}}
import javax.xml.bind.annotation.*;
{{/withXml}}
import java.util.*;
import javax.annotation.Generated;
{{#models}}
{{#model}}
{{#isEnum}}
{{>enumOuterClass}}
{{/isEnum}}
{{^isEnum}}
{{#vendorExtensions.x-is-one-of-interface}}{{>oneof_interface}}{{/vendorExtensions.x-is-one-of-interface}}{{^vendorExtensions.x-is-one-of-interface}}{{>pojo}}{{/vendorExtensions.x-is-one-of-interface}}
{{/isEnum}}
{{/model}}
{{/models}}
import lombok.Builder;
import lombok.Value;
import lombok.extern.jackson.Jacksonized;
@Value
@Builder(toBuilder = true)
@Jacksonized
{{>generatedAnnotation}}
public class {{classname}}{{#parent}} extends {{{parent}}}{{/parent}}{{^parent}}{{#hateoas}} extends RepresentationModel<{{classname}}> {{/hateoas}}{{/parent}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
{{#vars}}
{{#isEnum}}
{{^isContainer}}
{{>enumClass}}
{{/isContainer}}
{{#isContainer}}
{{#mostInnerItems}}
{{>enumClass}}
{{/mostInnerItems}}
{{/isContainer}}
{{/isEnum}}
@Schema({{#required}}required = {{required}}, {{/required}}description = "{{description}}")
{{#useBeanValidation}}
{{>beanValidation}}
{{/useBeanValidation}}
{{#isContainer}}
{{>nullableDataType}} {{name}};
{{/isContainer}}
{{^isContainer}}
{{>nullableDataType}} {{name}}{{#isNullable}} = null{{/isNullable}}{{^isNullable}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/isNullable}};
{{/isContainer}}
{{/vars}}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment