This blog will show you how to create a controller and a model for your RESTful API using Spring MVC and Swagger. You will also learn how to test your API with Swagger UI.
1. Introduction
In this blog, you will learn how to create a controller and a model for your RESTful API using Spring MVC and Swagger. You will also learn how to test your API with Swagger UI.
A RESTful API is an application programming interface that follows the principles of Representational State Transfer (REST), a software architectural style that defines a set of constraints for creating web services. A RESTful API allows clients to access and manipulate resources on a server using standard HTTP methods such as GET, POST, PUT, and DELETE.
Spring MVC is a framework that provides a model-view-controller architecture for developing web applications using the Java programming language. Spring MVC simplifies the creation and handling of web requests and responses, and supports various features such as data binding, validation, exception handling, and internationalization.
Swagger is a set of tools and specifications that help developers design, document, and test RESTful APIs. Swagger consists of two main components: Swagger Core and Swagger UI. Swagger Core is a library that enables you to annotate your Java classes with annotations that describe the metadata of your API, such as the endpoints, parameters, responses, and models. Swagger UI is a web-based interface that generates interactive documentation and testing tools from the Swagger Core annotations.
By integrating Spring MVC and Swagger, you can easily create and document your RESTful API with minimal code and configuration. You can also use Swagger UI to explore and test your API in a user-friendly way.
Are you ready to get started? Let’s begin by setting up Spring MVC and Swagger in the next section.
2. Setting Up Spring MVC and Swagger
In this section, you will learn how to set up Spring MVC and Swagger in your project. You will need the following tools and dependencies:
- A Java Development Kit (JDK) version 8 or higher. You can download it from here.
- An Integrated Development Environment (IDE) of your choice. You can use Eclipse, IntelliJ IDEA, NetBeans, or any other IDE that supports Java and Maven.
- A Maven project with the spring-boot-starter-web and springfox-swagger2 dependencies. You can create a new Maven project using the Spring Initializr or use an existing one. The spring-boot-starter-web dependency provides the core features of Spring MVC, such as web request handling, data binding, and validation. The springfox-swagger2 dependency enables you to integrate Swagger with Spring MVC.
Once you have the tools and dependencies ready, you can follow these steps to set up Spring MVC and Swagger:
- Create a new package named com.example.demo in your src/main/java folder. This will be the base package for your application classes.
- Create a new class named DemoApplication in the com.example.demo package. This will be the main class that runs your application. Annotate the class with @SpringBootApplication, which indicates that this is a Spring Boot application. The code for the class should look like this:
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
- Create a new class named SwaggerConfig in the com.example.demo package. This will be the class that configures Swagger for your application. Annotate the class with @Configuration and @EnableSwagger2, which indicate that this is a configuration class and that Swagger is enabled. The code for the class should look like this:
package com.example.demo; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.example.demo")) .paths
3. Creating a Controller Class
In this section, you will learn how to create a controller class for your RESTful API using Spring MVC and Swagger. A controller class is a Java class that handles the web requests and responses for a specific resource or functionality of your API. For example, you can create a controller class to manage the operations related to users, such as creating, retrieving, updating, and deleting users.
To create a controller class, you need to follow these steps:
- Create a new package named com.example.demo.controller in your src/main/java folder. This will be the package for your controller classes.
- Create a new class named UserController in the com.example.demo.controller package. This will be the controller class for the user resource. Annotate the class with @RestController, which indicates that this is a controller class that returns data in JSON format. The code for the class should look like this:
package com.example.demo.controller; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { // code for request mapping methods }
- Define the request mapping methods for the user resource. These are the methods that handle the HTTP requests for the different operations on the user resource, such as GET, POST, PUT, and DELETE. You need to annotate each method with @RequestMapping, which specifies the URL path, the HTTP method, and the response status code for the request. You also need to annotate the method parameters with @PathVariable, @RequestParam, or @RequestBody, which indicate the source of the data for the request, such as the URL path, the query string, or the request body. You can also use @Valid to validate the request data using the annotations in the model class. The code for the request mapping methods should look like this:
package com.example.demo.controller; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; @RestController public class UserController { // code for request mapping methods // GET /users - get all users @RequestMapping(value = "/users", method = RequestMethod.GET) public ResponseEntity<List> getAllUsers() { // code for getting all users from the service layer } // GET /users/{id} - get a user by id @RequestMapping(value = "/users/{id}", method = RequestMethod.GET) public ResponseEntity getUserById(@PathVariable("id") Long id) { // code for getting a user by id from the service layer } // POST /users - create a new user @RequestMapping(value = "/users", method = RequestMethod.POST) public ResponseEntity createUser(@Valid @RequestBody User user) { // code for creating a new user in the service layer } // PUT /users/{id} - update a user by id @RequestMapping(value = "/users/{id}", method = RequestMethod.PUT) public ResponseEntity updateUser(@PathVariable("id") Long id, @Valid @RequestBody User user) { // code for updating a user by id in the service layer } // DELETE /users/{id} - delete a user by id @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE) public ResponseEntity deleteUser(@PathVariable("id") Long id) { // code for deleting a user by id in the service layer } }
By following these steps, you have created a controller class for the user resource. You can create more controller classes for other resources of your API in the same way. In the next section, you will learn how to annotate the controller class and the request mapping methods with Swagger annotations to document your API.
3.1. Annotating the Controller Class
In this section, you will learn how to annotate the controller class and the request mapping methods with Swagger annotations to document your RESTful API. Swagger annotations are special comments that provide additional information about your API, such as the description, the parameters, the responses, and the models. Swagger uses these annotations to generate the interactive documentation and testing tools for your API.
To annotate the controller class and the request mapping methods, you need to follow these steps:
- Annotate the controller class with @Api, which specifies the name and the description of the API. You can also use the tags attribute to group the controller classes by categories. For example, you can tag the UserController class with “User” to indicate that this is the controller class for the user resource. The code for the annotation should look like this:
package com.example.demo.controller; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.RestController; @Api(value = "User API", description = "Operations pertaining to user management", tags = "User") @RestController public class UserController { // code for request mapping methods }
- Annotate each request mapping method with @ApiOperation, which specifies the summary and the description of the operation. You can also use the notes attribute to provide more details about the operation, such as the input, the output, and the logic. The code for the annotation should look like this:
package com.example.demo.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @Api(value = "User API", description = "Operations pertaining to user management", tags = "User") @RestController public class UserController { // code for request mapping methods // GET /users - get all users @ApiOperation(value = "Get all users", notes = "Returns a list of all users in the database") @RequestMapping(value = "/users", method = RequestMethod.GET) public ResponseEntity<List> getAllUsers() { // code for getting all users from the service layer } // GET /users/{id} - get a user by id @ApiOperation(value = "Get a user by id", notes = "Returns a single user by their id") @RequestMapping(value = "/users/{id}", method = RequestMethod.GET) public ResponseEntity getUserById(@PathVariable("id") Long id) { // code for getting a user by id from the service layer } // POST /users - create a new user @ApiOperation(value = "Create a new user", notes = "Creates and returns a new user in the database") @RequestMapping(value = "/users", method = RequestMethod.POST) public ResponseEntity createUser(@Valid @RequestBody User user) { // code for creating a new user in the service layer } // PUT /users/{id} - update a user by id @ApiOperation(value = "Update a user by id", notes = "Updates and returns an existing user by their id") @RequestMapping(value = "/users/{id}", method = RequestMethod.PUT) public ResponseEntity updateUser(@PathVariable("id") Long id, @Valid @RequestBody User user) { // code for updating a user by id in the service layer } // DELETE /users/{id} - delete a user by id @ApiOperation(value = "Delete a user by id", notes = "Deletes a user by their id from the database") @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE) public ResponseEntity deleteUser(@PathVariable("id") Long id) { // code for deleting a user by id in the service layer } }
- Annotate each method parameter with @ApiParam, which specifies the name, the description, the type, and the required status of the parameter. You can also use the example attribute to provide a sample value for the parameter. The code for the annotation should look like this:
package com.example.demo.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.*; @Api(value = "User API", description = "Operations pertaining to user management", tags = "User") @RestController public class UserController { // code for request mapping methods // GET /users - get all users @ApiOperation(value = "Get all users", notes = "Returns a list of all users in the database") @RequestMapping(value = "/users", method = RequestMethod.GET) public ResponseEntity<List> getAllUsers() { // code for getting all users from the service layer } // GET /users/{id} - get a user by id @ApiOperation(value = "Get a user by id", notes = "Returns a single user by their id") @RequestMapping(value = "/users/{id}", method = RequestMethod.GET) public ResponseEntity getUserById(@ApiParam(value = "The id of the user to retrieve", type = "Long", required = true, example = "1") @PathVariable("id") Long id) { // code for getting a user by id from the service layer } // POST /users - create a new user @ApiOperation(value = "Create a new user", notes = "Creates and returns a new user in the database") @RequestMapping(value = "/users", method = RequestMethod.POST) public ResponseEntity createUser(@ApiParam(value = "The user object to create", type = "User", required = true, example = "{\"name\":\"Alice\",\"age\":25}") @Valid @RequestBody User user) { // code for creating a new user in the service layer } // PUT /users/{id} - update a user by id @ApiOperation(value = "Update a user by id", notes = "Updates and returns an existing user by their id") @RequestMapping(value = "/users/{id}", method = RequestMethod.PUT) public ResponseEntity updateUser(@ApiParam(value = "The id of the user to update", type = "Long", required = true, example = "1") @PathVariable("id") Long id, @ApiParam(value = "The user object to update", type = "User", required = true, example = "{\"name\":\"Bob\",\"age\":30}") @Valid @RequestBody User user) { // code for updating a user by id in the service layer } // DELETE /users/{id} - delete a user by id @ApiOperation(value = "Delete a user by id", notes = "Deletes a user by their id from the database") @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE) public ResponseEntity deleteUser(@ApiParam(value = "The id of the user to delete", type = "Long", required = true, example = "1") @PathVariable("id") Long id) { // code for deleting a user by id in the service layer } }
By following these steps, you have annotated the controller class and the request mapping methods with Swagger annotations. These annotations will help Swagger to generate the interactive documentation and testing tools for your API. In the next section, you will learn how to create a model class and annotate it with Swagger annotations to define the data structure of your API.
3.2. Defining the Request Mapping Methods
In this section, you will learn how to define the request mapping methods for your controller class. These are the methods that handle the web requests and responses for a specific resource or functionality of your RESTful API. For example, you can define a request mapping method to get a user by their id, create a new user, update an existing user, or delete a user.
To define the request mapping methods, you need to follow these steps:
- Import the necessary classes and annotations from the org.springframework.web.bind.annotation package. These include @RequestMapping, @PathVariable, @RequestParam, @RequestBody, @Valid, and the HTTP method annotations such as @GetMapping, @PostMapping, @PutMapping, and @DeleteMapping.
- Annotate each method with @RequestMapping or one of the HTTP method annotations, which specify the URL path, the HTTP method, and the response status code for the request. For example, you can use @GetMapping(“/users/{id}”) to indicate that this method handles a GET request to the /users/{id} path and returns a 200 OK status code.
- Annotate the method parameters with @PathVariable, @RequestParam, or @RequestBody, which indicate the source of the data for the request, such as the URL path, the query string, or the request body. For example, you can use @PathVariable(“id”) Long id to indicate that this parameter is extracted from the {id} part of the URL path and has a Long type.
- Use @Valid to validate the request data using the annotations in the model class. For example, you can use @Valid @RequestBody User user to indicate that this parameter is a User object that comes from the request body and needs to be validated according to the rules defined in the User class.
- Return a ResponseEntity object that wraps the response data and the response status code. For example, you can use return new ResponseEntity<>(user, HttpStatus.OK) to return a User object and a 200 OK status code.
- Use the service layer to perform the business logic and interact with the data layer. For example, you can use userService.getUserById(id) to get a User object by their id from the service layer.
By following these steps, you have defined the request mapping methods for your controller class. You can define more request mapping methods for other operations on your resource in the same way. In the next section, you will learn how to create a model class and annotate it with Swagger annotations to define the data structure of your API.
4. Creating a Model Class
In this section, you will learn how to create a model class for your RESTful API using Spring MVC and Swagger. A model class is a Java class that defines the data structure of your resource, such as the properties, the data types, and the validation rules. For example, you can create a model class to represent a user, with properties such as name, age, and email.
To create a model class, you need to follow these steps:
- Create a new package named com.example.demo.model in your src/main/java folder. This will be the package for your model classes.
- Create a new class named User in the com.example.demo.model package. This will be the model class for the user resource. The code for the class should look like this:
package com.example.demo.model; public class User { // code for properties and getters/setters }
- Add the properties and the getters/setters for the user resource. These are the attributes that define the data structure of the user, such as name, age, and email. You can use the @Data annotation from the lombok library to automatically generate the getters/setters for the properties. The code for the properties and the getters/setters should look like this:
package com.example.demo.model; import lombok.Data; @Data public class User { // code for properties and getters/setters private Long id; // the id of the user private String name; // the name of the user private Integer age; // the age of the user private String email; // the email of the user }
- Annotate the properties with @ApiModelProperty, which specifies the name, the description, the type, and the required status of the property. You can also use the example attribute to provide a sample value for the property. The code for the annotation should look like this:
package com.example.demo.model; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class User { // code for properties and getters/setters @ApiModelProperty(value = "The id of the user", type = "Long", required = true, example = "1") private Long id; // the id of the user @ApiModelProperty(value = "The name of the user", type = "String", required = true, example = "Alice") private String name; // the name of the user @ApiModelProperty(value = "The age of the user", type = "Integer", required = true, example = "25") private Integer age; // the age of the user @ApiModelProperty(value = "The email of the user", type = "String", required = true, example = "alice@example.com") private String email; // the email of the user }
- Annotate the properties with validation annotations from the javax.validation.constraints package, such as @NotNull, @Min, @Max, @Size, or @Email. These annotations define the rules for validating the data of the properties, such as the minimum and maximum values, the length, or the format. The code for the validation annotations should look like this:
package com.example.demo.model; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.*; @Data public class User { // code for properties and getters/setters @ApiModelProperty(value = "The id of the user", type = "Long", required = true, example = "1") @NotNull // the id cannot be null private Long id; // the id of the user @ApiModelProperty(value = "The name of the user", type = "String", required = true, example = "Alice") @NotBlank // the name cannot be blank @Size(min = 2, max = 50) // the name must be between 2 and 50 characters private String name; // the name of the user @ApiModelProperty(value = "The age of the user", type = "Integer", required = true, example = "25") @NotNull // the age cannot be null @Min(18) // the age must be at least 18 @Max(120) // the age must be at most 120 private Integer age; // the age of the user @ApiModelProperty(value = "The email of the user", type = "String", required = true, example = "alice@example.com") @NotBlank // the email cannot be blank @Email // the email must be a valid email address private String email; // the email of the user }
By following these steps, you have created a model class for the user resource. You can create more model classes for other resources of your API in the same way. In the next section, you will learn how to test your RESTful API with Swagger UI.
4.1. Annotating the Model Class
In this section, you will learn how to annotate the model class for your RESTful API. A model class is a Java class that represents a data entity or a resource in your API. For example, if your API is about books, you might have a model class named Book that has properties such as title, author, genre, and price.
Annotating the model class with Swagger annotations allows you to document the metadata of your resource, such as the description, the required fields, the example values, and the validation constraints. This helps you to generate accurate and consistent documentation for your API, as well as to validate the input and output of your API.
To annotate the model class, you will need to use the following annotations from the io.swagger.annotations package:
- @ApiModel: This annotation is used at the class level to describe the model. You can provide a value attribute to specify the name of the model, and a description attribute to provide a brief explanation of the model.
- @ApiModelProperty: This annotation is used at the field level to describe the property. You can provide various attributes to specify the metadata of the property, such as name, value, example, required, dataType, allowableValues, and notes. You can also use the @Valid annotation from the javax.validation.constraints package to apply validation rules to the property, such as @NotNull, @Size, @Min, and @Max.
Let’s see an example of how to annotate a model class named Person that has properties such as id, name, age, and email. The code for the class should look like this:
package com.example.demo.model; import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel(value = "Person", description = "A person entity") public class Person { @ApiModelProperty(name = "id", value = "The unique identifier of the person", example = "1", required = true) @NotNull private Long id; @ApiModelProperty(name = "name", value = "The name of the person", example = "John Doe", required = true) @NotNull @Size(min = 2, max = 50) private String name; @ApiModelProperty(name = "age", value = "The age of the person", example = "25", required = true) @NotNull @Min(1) @Max(120) private Integer age; @ApiModelProperty(name = "email", value = "The email address of the person", example = "john.doe@example.com", required = false) @Email private String email; // getters and setters omitted for brevity }
As you can see, the @ApiModel annotation gives the name and description of the model class. The @ApiModelProperty annotations give the name, value, example, and required attributes of each property. The @Valid annotations enforce the validation rules for each property, such as not null, size range, minimum and maximum values, and email format.
By annotating the model class, you can document and validate your resource in a simple and consistent way. In the next section, you will learn how to add the properties and getters/setters to the model class.
4.2. Adding the Properties and Getters/Setters
In this section, you will learn how to add the properties and getters/setters to the model class for your RESTful API. A property is a field that stores the data of the model class, such as the id, name, age, and email of the Person class. A getter is a method that returns the value of a property, and a setter is a method that sets the value of a property.
Adding the properties and getters/setters to the model class is a simple and straightforward task. You just need to follow these steps:
- Declare the properties as private variables with the appropriate data type, such as Long, String, or Integer. You can also initialize the properties with some default values if you want.
- Generate the getters and setters for each property using your IDE or manually. The getters and setters should follow the Java naming convention, such as getId(), setId(Long id), getName(), and setName(String name). The getters should return the value of the property, and the setters should assign the value of the parameter to the property.
- Optionally, you can override the toString() method to return a string representation of the model class. This can be useful for debugging or logging purposes.
Let’s see an example of how to add the properties and getters/setters to the Person class. The code for the class should look like this:
package com.example.demo.model; import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel(value = "Person", description = "A person entity") public class Person { @ApiModelProperty(name = "id", value = "The unique identifier of the person", example = "1", required = true) @NotNull private Long id; @ApiModelProperty(name = "name", value = "The name of the person", example = "John Doe", required = true) @NotNull @Size(min = 2, max = 50) private String name; @ApiModelProperty(name = "age", value = "The age of the person", example = "25", required = true) @NotNull @Min(1) @Max(120) private Integer age; @ApiModelProperty(name = "email", value = "The email address of the person", example = "john.doe@example.com", required = false) @Email private String email; // getters and setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } // toString method @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + ", email=" + email + "]"; } }
As you can see, the properties and getters/setters are added to the model class following the steps described above. You can also see the toString() method that returns a string representation of the model class.
By adding the properties and getters/setters to the model class, you can create and manipulate the data of your resource in a convenient and consistent way. In the next section, you will learn how to test your RESTful API with Swagger UI.
5. Testing the RESTful API with Swagger UI
In this section, you will learn how to test your RESTful API with Swagger UI. Swagger UI is a web-based interface that generates interactive documentation and testing tools from the Swagger annotations in your code. You can use Swagger UI to explore and test your API endpoints, parameters, responses, and models in a user-friendly way.
To test your RESTful API with Swagger UI, you will need to follow these steps:
- Run your application by right-clicking on the DemoApplication class and selecting Run As and then Java Application. This will start your application on the default port 8080.
- Open your browser and navigate to http://localhost:8080/swagger-ui.html. This will open the Swagger UI interface for your application.
- Expand the person-controller section by clicking on the arrow next to it. This will show you the list of endpoints that are available in your controller class.
The list of endpoints in the person-controller section
- Select an endpoint that you want to test by clicking on it. For example, let’s select the GET /persons endpoint, which returns the list of all persons in the database.
The details of the GET /persons endpoint
- Click on the Try it out button to execute the endpoint. This will send a GET request to the /persons URL and display the response in the Response body section.
The response of the GET /persons endpoint
- Repeat the steps 4 and 5 for other endpoints that you want to test. You can also modify the parameters and the request body as needed. For example, let’s test the POST /persons endpoint, which creates a new person in the database.
By testing your RESTful API with Swagger UI, you can verify that your API works as expected and that your documentation is accurate and consistent. You can also discover and fix any errors or bugs in your code. Swagger UI is a powerful and convenient tool that helps you to design, document, and test your RESTful API with ease.
Congratulations! You have successfully created a controller and a model for your RESTful API using Spring MVC and Swagger. You have also learned how to annotate your classes with Swagger annotations and how to test your API with Swagger UI. You have gained valuable skills and knowledge that will help you to develop and document your own RESTful APIs in the future.
In the next and final section, you will learn how to conclude your blog and provide some useful resources for further learning.
6. Conclusion
In this blog, you have learned how to create a controller and a model for your RESTful API using Spring MVC and Swagger. You have also learned how to annotate your classes with Swagger annotations and how to test your API with Swagger UI.
You have gained valuable skills and knowledge that will help you to develop and document your own RESTful APIs in the future. You have also seen how Spring MVC and Swagger can work together to provide a powerful and convenient framework for creating and testing web services.
Here are some key points that you should remember from this blog:
- A RESTful API is an application programming interface that follows the principles of Representational State Transfer (REST), a software architectural style that defines a set of constraints for creating web services.
- Spring MVC is a framework that provides a model-view-controller architecture for developing web applications using the Java programming language.
- Swagger is a set of tools and specifications that help developers design, document, and test RESTful APIs.
- Swagger Core is a library that enables you to annotate your Java classes with annotations that describe the metadata of your API, such as the endpoints, parameters, responses, and models.
- Swagger UI is a web-based interface that generates interactive documentation and testing tools from the Swagger Core annotations.
- To create a controller class, you need to annotate the class with @RestController, which indicates that the class is a controller that handles web requests and returns JSON responses.
- To create a model class, you need to annotate the class with @ApiModel, which indicates that the class is a model that represents a data entity or a resource in your API.
- To annotate the controller class, you need to use the @ApiOperation, @ApiParam, and @ApiResponse annotations from the io.swagger.annotations package.
- To annotate the model class, you need to use the @ApiModelProperty annotation from the io.swagger.annotations package.
- To test your RESTful API with Swagger UI, you need to run your application and navigate to http://localhost:8080/swagger-ui.html in your browser.
We hope you enjoyed this blog and found it useful and informative. If you want to learn more about Spring MVC, Swagger, or RESTful APIs, here are some resources that you can check out:
Thank you for reading this blog and happy coding!