Microservices API Documentation with Swagger2 – Piotr’s TechBlog

Swagger is the most popular tool for designing, building and documenting RESTful APIs. It has nice integration with Spring Boot. To use it in conjunction with Spring we need to add following two dependencies to Maven pom.xml.


Swagger configuration for single Spring Boot service is pretty simple. The level of complexity is greater if you want to create one documentation for several separated microservices. Such documentation should be available on API gateway. In the picture below you can see the architecture of our sample solution.


First, we should configure Swagger on every microservice. To enable it we have to declare @EnableSwagger2 on the main class. API documentation will be automatically generated from source code by Swagger library during application startup. The process is controlled by Docket @Bean which is also declared in the main class. API version is read from pom.xml file using MavenXpp3Reader. We also set some other properties like title, author and description using apiInfo method. By default, Swagger generates documentation for all REST services including those created by Spring Boot. We would like to limit documentation only to our @RestController located inside pl.piomin.microservices.advanced.account.api package.

public Docket api() throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(new FileReader(“pom.xml”));
return new Docket(DocumentationType.SWAGGER_2)
.build().apiInfo(new ApiInfo(“Account Service Api Documentation”, “Documentation automatically generated”, model.getParent().getVersion(), null, new Contact(“Piotr Mińkowski”, “piotrminkowski.wordpress.com”, “piotr.minkowski@gmail.com”), null, null));

Here’s our API RESTful controller.

public class AccountController {

AccountRepository repository;

protected Logger logger = Logger.getLogger(AccountController.class.getName());

@RequestMapping(value = “/accounts/”, method = RequestMethod.GET)
public Account findByNumber(@PathVariable(“number”) String number) {
logger.info(String.format(“Account.findByNumber(%s)”, number));
return repository.findByNumber(number);

@RequestMapping(value = “/accounts/customer/”, method = RequestMethod.GET)
public List findByCustomer(@PathVariable(“customer”) String customerId) {
logger.info(String.format(“Account.findByCustomer(%s)”, customerId));
return repository.findByCustomerId(customerId);

@RequestMapping(value = “/accounts”, method = RequestMethod.GET)
public List findAll() {
return repository.findAll();

@RequestMapping(value = “/accounts”, method = RequestMethod.POST)
public Account add(@RequestBody Account account) {
logger.info(String.format(“Account.add(%s)”, account));
return repository.save(account);

@RequestMapping(value = “/accounts”, method = RequestMethod.PUT)
public Account update(@RequestBody Account account) {
logger.info(String.format(“Account.update(%s)”, account));
return repository.save(account);


The similar Swagger’s configuration exists on every microservice. API documentation is available under http://localhost:/swagger-ui.html. Now, we would like to enable one documentation embedded on the gateway for all microservices. Here’s Spring @Component implementing SwaggerResourcesProvider interface which overrides default provider configuration exists in Spring context.

public class DocumentationController implements SwaggerResourcesProvider {

public List get() {
List resources = new ArrayList<>();
resources.add(swaggerResource(“account-service”, “/api/account/v2/api-docs”, “2.0”));
resources.add(swaggerResource(“customer-service”, “/api/customer/v2/api-docs”, “2.0”));
resources.add(swaggerResource(“product-service”, “/api/product/v2/api-docs”, “2.0”));
resources.add(swaggerResource(“transfer-service”, “/api/transfer/v2/api-docs”, “2.0”));
return resources;

private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
return swaggerResource;


All microservices api-docs are added as Swagger resources. The location address is proxied via Zuul gateway. Here’s gateway route configuration.

prefix: /api
path: /account/**
serviceId: account-service
path: /customer/**
serviceId: customer-service
path: /product/**
serviceId: product-service
path: /transfer/**
serviceId: transfer-service

Now, API documentation is available under gateway address http://localhost:8765/swagger-ui.html. You can see how it looks for account service in the picture below. We can select source service in the combo box placed inside title panel.


Documentation appearence can be easily customized by providing UIConfiguration @Bean. In the code below I changed default operations expansion level by setting “list” as a second constructor parameter – docExpansion.

UiConfiguration uiConfig() {
return new UiConfiguration(“validatorUrl”, “list”, “alpha”, “schema”,
UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS, false, true, 60000L);

You can expand every operation to see the details. Every operation can be test by providing required parameters and clicking Try it out! button.



Sample application source code is available on GitHub.


Leave a comment

Your email address will not be published. Required fields are marked *