Skip to main content

Swag your Swagger

Document your REST API with Swagger

Swagger is a great tool to allow you do document your REST based APIs and provides an interactive sandbox for clients or testers to interact with the API.  Certainly go and check out what Swagger has to offer at Swagger.io .

However as I found as of 2016, most of the examples available on the web regarding how to get Swagger up and running details what to do when you are using Spring-boot.  Therefore I'm providing my write up to assist anyone who is trying to make swagger available form a SpringMVC application.  I had a surprising level of pain getting it to work, considering the lack of details regarding specifics for this type of application.

As is becoming common in my posts, I will first provide you a quick summary of the stack (tools/framework in play).  Things are constantly evolving and you will need to assess your frameworks and version versus what I used in May of 2016.

Prerequisite stack:

  • Spring-core 4.2.4-RELEASE
  • Spring-webmvc 4.2.4-RELEASE
  • Springfox-swagger2 2.4.0
  • Bootstrap 3.3.5 webjars
  • Maven 3.0.5
  • Running on Apache Tomcat 7.0.67

Background:

Hopefully you already have a SpringMVC based REST API application on which you can try enabling Swagger.  First you will notice that there are now versions 1.2 and versions 2.0 of Swagger. This post deals with working and configuring Swagger 2.   Springfox is a library developed to allow you to plug swagger into Spring based applications (Spring, Spring-boot, or SpringMVC).  The library supports both the the Swagger 1.2 and 2.0 specs. Note that Springfox replaced the Swagger-SpringMVC implementation.

Wire it up:

1) Most of the documentation you will find will tell you to add the io.springfox Swagger maven dependency

  <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.4.0</version>
  </dependency>

2) Then details of Spring annotated Configuration class that uses the Docket class in replace of the old SwaggerSpringMvcPlugin. A typical example class you see will probably look like

  @Configuration
  @EnableSwagger2
  public class SwaggerConfiguration {

    @Bean
    public Docket api() {
      return new Docket(DocumentationType.SWAGGER_2)
              .select()
              .apis(RequestHandlerSelectors.any())
              .paths(PathSelectors.any())
              .build();
    }
  }

- The @Configuration annotation tells Spring to use the class for configuration of the Spring IOC Container.
- The @EnableSwagger2 indicates to activate the Swagger2.0 specification.
- The Docket as indicated is the replacement for the old SwaggerSpringMvcPlugin and is the primary api configuration mechanism to initialize swagger (v2.0).
- The .apis() selector allows you to indicate any or matching criteria for request handlers.
- The .paths() selector allows you to select any resource paths or filter on certain matches sets (regex matches for example).

3) Then if you want to include the nice sandbox and reference HTML produced by Swagger



then add the swagger ui-maven dependency.

  <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.4.0</version>
  </dependency>

Then it says you are good to go to build your maven project and deploy to your container.  Then you should be able to access the swagger api-docs via http://<your-container-root>/<your-webapp-root>/v2/api-docs/ and the swagger-ui from url http://<your-container-root>/<your-webapp-root>/swagger-ui.html

Nothing:

To your dismay you will probably find you get a 404 when trying to access the api-docs url and you will not see any errors in your container or application logs.  I will not re-trace all of the things I tried to get this running, but I will detail what needed to be done in the end (it ended up being relatively simple).

The key:

1) You may find buried within the Springfox Reference Documentation the key, in section 5.5 Docket Spring Java Configuration.  There is a NOTE: that @EnableWebMvc is needed for non-springboot applications.  So now your Configuration class should look like:
  
  @Configuration
  @EnableWebMvc 
  @EnableSwagger2
  public class SwaggerConfiguration {

    @Bean
    public Docket api() {
      return new Docket(DocumentationType.SWAGGER_2)
              .select()
              .apis(RequestHandlerSelectors.any())
              .paths(PathSelectors.any())
              .build();
    }
  }

I should probably also mention that you do need to have component-scan configured either in your xml configuration for the dispatcher, or the Configuration class.  I would assume you already had that in place, if you had a working spring webmvc application.  I have placed it in my xml configuration <context:component-scan base-package="com.myworld"/>. Howerver you could add the @ComponentScan annotation to the Configuration class above if preferred.  There are many enhancements within Spring 4 that could allow you to get away from the remaining parts of XML configuration that was done in 2.x and 3.x.  I will leave it to the reader to decide whether they think that is a good idea or not.

1B) The Swagger mapping key: Be careful the default configuration of Swagger resources may bite you or not. Depending on how you have your <servlet-mapping> for the Spring MVC DispatcherServlet in your web.xml file.  If you use a url-pattern convention of say /services/* or something else other than the root app context (/) then you may find that none of the Swagger ancillary resources are found for the Swagger-ui.  You will need to add a new resources mapping within the dispatcher-servlet configuration file:

  <!-- This configuration is to support nesting the swagger-ui on there /services/ relative servlet mapping
         instead of the default route. -->
    <mvc:resources mapping="**/**"
                   location="classpath:/META-INF/resources/" />

Note: If you have moved to entire Annotation based configuration you can also do this in a Configuration class that  extends the WebMvcConfigurerAdapter and override the add ResourceHandlers method.  An example would look like:


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("**/**")
                .addResourceLocations("classpath:/META-INF/resources/"); 
    }

Finished

Now when you rebuild your application and deploy, you should be able to access both the api-docs and swagger-ui (http://<your-container-root>/<your-webapp-root>/v2/api-docs/ and http://<your-container-root>/<your-webapp-root>/swagger-ui.html.  Enjoy.

Comments

  1. Also putting

    @PropertySource({"classpath:swagger.properties"})

    in the SwaggerConfiguration you can override the default api-docs configuration. Obviously you have to create a swagger.properties and put it into src/main/resources folder

    ReplyDelete
  2. Mobile app development and web development agency in London, Luton, Birmingham, Derby, Sheffield, UK

    mobile app development company in luton
    mobile application development company in luton
    mobile app development company in birmingham
    mobile application development company in birmingham
    mobile app development company in sheffield
    mobile application development company in sheffield
    mobile app development company in derby
    mobile application development company in derby
    mobile app development company in london
    mobile application development company in london

    Android app development company in luton
    Android application development company in luton
    Android app development company in birmingham
    Android application development company in birmingham
    Android app development company in Sheffield
    Android application development company in Sheffield
    Android app development company in derby
    Android application development company in derby
    Android app development company in London
    Android application development company in London

    iOS app development company in luton
    iOS application development company in luton

    iOS app development company in birmingham
    iOS application development company in birmingham
    iOS app development company in Sheffield
    iOS application development company in Sheffield
    iOS app development company in derby
    iOS application development company in derby
    iOS app development company in London
    iOS application development company in London

    website development company in luton
    web development company in luton
    website development company in birmingham
    web development company in birmingham
    website development company in sheffield
    web development company in sheffield
    website development company in derby
    web development company in derby
    website development company in london
    web development company in london

    web design company in luton
    website design company in luton
    web design company in birmingham
    website design company in birmingham
    web design company in sheffield
    website design company in sheffield
    web design company in derby
    website design company in derby
    web design company in London
    website design company in London

    app developers in luton
    application developers in luton
    app developers in birmingham
    application developers in birmingham
    app developers in sheffield
    application developers in sheffield
    app developers in derby
    application developers in derby
    app developers in london
    application developers in london

    custom web design in luton
    custom website design in luton
    ecommerce web design company in luton
    custom web development company in luton
    wordpress website design company in luton
    graphic design companies websites in luton
    best website design companies for small business in luton

    custom web design in birmingham
    custom website design in birmingham
    ecommerce web design company in birmingham
    custom web development company in birmingham
    wordpress website design company in birmingham
    graphic design companies websites in birmingham
    best website design companies for small business in birmingham

    custom web design in Sheffield
    custom website design in Sheffield
    ecommerce web design company in Sheffield
    custom web development company in Sheffield
    wordpress website design company in Sheffield
    graphic design companies websites in Sheffield
    best website design companies for small business in Sheffield

    For more: innovationm.co.uk

    ReplyDelete
  3. "Thanks for sharing this information.
    Biharapps is the best website design agency and mobile app development company in Patna, Bihar. Top andoid app developers and iOS app developers, web designers in Patna and Software development company in Patna, Bihar. We are website designer in patna "

    ReplyDelete

Post a Comment

Popular posts from this blog

HTML5 Canvas nightmares with JSF

The last couple of days have been one of those 'why is this so difficult' moments. I essentially lost more than a day trying to figure out how to get HTML5 canvases to show up in one of our JSF applications. Here is the background on the stack: JBoss AS 7.2.0 JDK 1.7.x Seam (JSF Framework) v2.2.0 Richfaces v3.3.3 Essentially we wanted to introduce a canvas to our page in order to graphical represent a numeric value and where it falls upon its normal range and possible range of values.   The page was leveraging a <ui:include> in order to display the results section.  It was a common component used among multiple pages and therefore the reason being pulled in via an include.  A richfaces commandLink was being used to initiate an AJAX request that would pull back none, one or many results and re-render the display within a JSF panelGroup.   Canvas Background:  If you look at any of the examples of using HTML5 canvases, you generally will see the definitio

WSO2: Simple Pass through proxy (REST to REST with HTML Reply)

Today I set out on trying to set up a simple passthrough proxy that would allow for a GET request to be made to REST style backend services that replies with HTML content. The proxy services was being set up on WS02 ESB v4.8.0.  I thought this was really going to be as simple as walking though their wizard and setting up a new proxy endpoint that just handed off to the behinds the scene service. It was straight forward to set up the proxy, but then unfortunately when called it just didn't respond. It took quite awhile to figure out what the issues was.  At first I was using the ESB admin console and review the System and Application Logs.  The Application Logs were certainly more useful, but they still truncated stack traces which made it hard to clue in on the real issue. It wasn't until I went and review the logs on the server that I was able to detect the cause.   <wso2_esb_root>/repository/logs/wso2-esb-errors.log 2015-03-19 16:09:43,001 [-] [Pass

Where to start on AngularJS for Java Developer

Background: If you are a Java developer who is comfortable using Eclipse (JEE Developer version) you may be asking yourself where to start with AngularJS. There is all kinds of documentation out there in regards to AngularJS and https://angularjs.org/ provides, to the point, tutorials on how to get started. You can certainly go that route and use node.js embedded server and possibly a Javascript focused IDE like WebStorm. However I wanted to try and stay in a comfort zone, my comfort zone, of Eclipse and be in a position to deploy an Angular application to a container like Tomcat. This blog entry will present the trail I took to try and accomplish it. Note: This is an adventure into Angular 1.x, not 2.x.  I would imagine this could all work with 2.x as well as it is focused on the dev environment setup. Start: Well the one consistent thing you will find to get started is to install the AngularJS Plugin, provided by Angelo ZERR.  You can use the Eclipse 4.5 (Mars) plugin inst