Each API requires comprehensive documentaiton. You can generate it using Swagger for a REST API. Its clients will get standardized and thorough insight while you won’t need to worry about keeping it up to date. Learn how to configure Swagger, generate documentation in JSON and render it with Swagger UI when frontend is supported by Angular.
What we are going to build
We are going to use Springfox to produce two versions of the docs:
- Swagger schema in JSON;
- more human-approachable documentation rendered by Swagger UI.
Our application can be built into a single jar along with the frontend, which is based on Angular 7. Since Spring Boot had to surrender routing control to Angular, we have to allow it to regain command over resources needed to display the web documentation generated with Swagger UI.
The project that was used as the example for this post is available in the GitHub repository – little-pinecone/scrum-ally.
- We are working on a
Spring Boot 2.1.2project with the
H2dependencies. You can read about setting up a similar project with Spring Initializr in How to create a new Spring Boot Project post.
Generate Swagger schema definition
Add Maven dependency
Include the Maven dependency for Springfox Swagger2 in the
In the application we are going to create a new configuration bean:
The annotation that indicates that Swagger support should be enabled. This should be applied to a Spring java config and should have an accompanying
public Docket scrumAllyApi()
Docket is a class that offers convenient methods and many useful defaults to help you configure a subset of services to be documented.
A filter for selecting paths that will be documented. I want to generate docs for all endpoints that start with . You can restrict Swagger from exposing the whole application by passing here a predicament for selecting routes that will be documented.
A filter for
RequestHandlerSelector. You can specify a package that is going to be documented: or you can filter endpoints using
withMethodAnnotationpredicate. In the example application the regex for is sufficient, therefore I didn’t have to override the default predicate –
any. You can specify here to which extent the API should be documented.
Allows us to provide additional data about the documented API.
You can learn more about configuration options in the Springfox Reference Documentation.
Verify the schema definition
Now, you should be able to test the configuration. Run the application locally and call the
http://localhost:8080/v2/api-docs link in Postman. You can see the JSON generated for scrum_ally API on the picture below:
Declare Response Content Type
If you haven’t declared the response type in
RequestMapping in your controllers yet, the schema generated with Swagger will reveal that your API can produce a response of any type. Mind the
"*/*" in the
The solution to the problem was described in this issue on GitHub. We have to impose the
"application/json" response content type on the controllers. Below, you can see the example for my
After rerunning the application, we can see the proper response content type in generated documentation:
You can see the work done in this section in the d93912fc2c170b781f3fd53b399f8efea7ac9b5d commit.
Generate user friendly documentation
Update Maven dependencies
Add the Maven dependency for Springfox Swagger UI:
Spring Boot auto-configuration takes care of handling the resources by default. If you haven’t overwrite it, you should be able to see the documentation by visiting
You can see the work done in this section in the 885c41d3b4e15ddf4a85ef4abc58752af72825cc commit.
The project doesn’t use the default Spring Boot resource handling
You have to manually specify the resources required by Swagger UI. See the example below:
All views are rendered by the frontend application (e.g. Angular)
In our example, we have a Spring Boot API integrated with Angular and all views are rendered by the fronted. So trying to run the rendered documentation results in
'Cannot match any routes. URL Segment: 'swagger-ui.html' error. To fix this, we are going to add the
"swagger-ui.html" resource handler to the registry in our
Generated JSON is invalid
You can verify the generated JSON by pasting it to the Swagger editor. The debugging process will be more straightforward with the aid of the validation. See the example below:
Security config makes reaching the docs impossible
Allow all GET requests to the documentation resources: