Course – LS (cat=REST)

Get started with Spring and Spring Boot, through the reference Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

Lombok is a Java library that helps to reduce boilerplate code like getters, setters, etc. OpenAPI provides a property to auto-generate a model with Lombok annotations.

In this tutorial, we’ll explore how to generate a model with Lombok annotations using an OpenAPI code generator.

2. Project Setup

To begin with, let’s bootstrap a Spring Boot project and add the Spring Boot Starter Web and Lombok dependencies:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.1.2</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

Additionally, we need the Swagger Annotations, Gson, and Java Annotation API dependencies and more to prevent errors related to packages in the generated code:

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>
<dependency>
    <groupId>io.swagger.core.v3</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>2.2.19</version>
</dependency>
<dependency>
    <groupId>org.openapitools</groupId>
    <artifactId>jackson-databind-nullable</artifactId>
    <version>7.1.0</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

In the next section, we’ll create an API specification for a model named Book and later generate the code with Lombok annotation using the OpenAPI code generator.

3. Generating Model Using OpenAPI

The idea of OpenAPI is to write the API specification before actual coding begins. Here, we’ll create a specification file and generate a model based on the specification.

3.1. Creating Model Specification

First, let’s create a new file named bookapi.yml in the resources folder to define the Book specification:

openapi: 3.0.2
info:
  version: 1.0.0
  title: Book Store
  license:
    name: MIT
paths:
    /books:
      get:
        tags:
          - book
        summary: Get All Books
        responses:
          200:
            description: successful operation
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/Book'
          404:
            description: Book not found
            content: { }
components:
  schemas:
    Book:
      type: object
      required:
        - id
        - name
        - author
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        author:
          type: string

In the specification above, we define the Book schema with id, name, and author fields. Additionally, we define an endpoint to get all stored books.

3.2. Generate a Model With Lombok Annotation

After defining the API specification, let’s add the OpenAPI plugin to the pom.xml to help generate the code based on the specification:

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>7.1.0</version>
    <executions>
        <execution>
	    <goals>
	        <goal>generate</goal>
	    </goals>
	    <configuration>
	        <inputSpec>${project.basedir}/src/main/resources/bookapi.yml</inputSpec>
		<generatorName>spring</generatorName>
		<configOptions>
		    <additionalModelTypeAnnotations>@lombok.Data @lombok.NoArgsConstructor @lombok.AllArgsConstructor</additionalModelTypeAnnotations>
		</configOptions>
		<generateApis>false</generateApis>
		<generateSupportingFiles>false</generateSupportingFiles>
		<generateApiDocumentation>false</generateApiDocumentation>
	    </configuration>
	</execution>
    </executions>
</plugin>

Here, we specify the location of the specification file for the plugin to check during the generation process. Also, we add the additionalModelTypeAnnotations property to add three Lombok annotations to the model.

For simplicity, we disable the generation of supporting files and API documentation.

Finally, let’s generate the Model by executing Maven install command:

$ ./mvnw install

The command above generates a Book model in the target folder.

3.3. Generated Code

Let’s see the generated Book model:

@lombok.Data @lombok.NoArgsConstructor @lombok.AllArgsConstructor

@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2024-01-03T22:22:14.557819500+02:00[Europe/Bucharest]")
public class Book {

  private Long id;

  private String name;

  private String author;

  // ..
}

In the generated code above, the three Lombok annotations we defined in the plugin using the additionalModelTypeAnnotations property are added to the model class.

The @Data annotation helps generate the getters, setters, etc., at compile time. The @NoArgsConstructor generates an empty constructor, and the @AllArgsConstructor generates a constructor that takes an argument for all fields in the class.

4. Conclusion

In this article, we learned how to generate a model with Lombok annotation using the OpenAPI code generator. Adding the additionalModelTypeAnnotations property provides us the flexibility to add desired Lombok annotations.

As always, the complete source code for the examples is available over on GitHub.

Course – LS (cat=REST)

Get started with Spring and Spring Boot, through the Learn Spring course :

>> CHECK OUT THE COURSE
res – REST (eBook) (cat=REST)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.