I am trying to configure swagger in my spring project, but hitting Hitting "http://localhost:8080/api-docs" says "404 Not Found".
Maven Dependency
<dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-springmvc</artifactId> <version>0.8.2</version> </dependency>
SwaggerConfig.java File
package com.ucap.swagger;import com.mangofactory.swagger.configuration.JacksonScalaSupport;import com.mangofactory.swagger.configuration.SpringSwaggerConfig;import com.mangofactory.swagger.configuration.SpringSwaggerModelConfig;import com.mangofactory.swagger.configuration.SwaggerGlobalSettings;import com.mangofactory.swagger.core.DefaultSwaggerPathProvider;import com.mangofactory.swagger.core.SwaggerApiResourceListing;import com.mangofactory.swagger.core.SwaggerPathProvider;import com.mangofactory.swagger.scanners.ApiListingReferenceScanner;import com.wordnik.swagger.model.*;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import static com.google.common.collect.Lists.newArrayList;@Configuration@ComponentScan(basePackages = "com.mangofactory.swagger")public class SwaggerConfig { public static final List<String> DEFAULT_INCLUDE_PATTERNS = Arrays.asList("/news/.*"); public static final String SWAGGER_GROUP = "mobile-api"; @Value("${app.docs}") private String docsLocation; @Autowired private SpringSwaggerConfig springSwaggerConfig; @Autowired private SpringSwaggerModelConfig springSwaggerModelConfig; /** * Adds the jackson scala module to the MappingJackson2HttpMessageConverter registered with spring * Swagger core models are scala so we need to be able to convert to JSON * Also registers some custom serializers needed to transform swagger models to swagger-ui required json format */ @Bean public JacksonScalaSupport jacksonScalaSupport() { JacksonScalaSupport jacksonScalaSupport = new JacksonScalaSupport(); //Set to false to disable jacksonScalaSupport.setRegisterScalaModule(true); return jacksonScalaSupport; } /** * Global swagger settings */ @Bean public SwaggerGlobalSettings swaggerGlobalSettings() { SwaggerGlobalSettings swaggerGlobalSettings = new SwaggerGlobalSettings(); swaggerGlobalSettings.setGlobalResponseMessages(springSwaggerConfig.defaultResponseMessages()); swaggerGlobalSettings.setIgnorableParameterTypes(springSwaggerConfig.defaultIgnorableParameterTypes()); swaggerGlobalSettings.setParameterDataTypes(springSwaggerModelConfig.defaultParameterDataTypes()); return swaggerGlobalSettings; } /** * API Info as it appears on the swagger-ui page */ private ApiInfo apiInfo() { ApiInfo apiInfo = new ApiInfo("News API","Mobile applications and beyond!","https://helloreverb.com/terms/","matt@raibledesigns.com","Apache 2.0","http://www.apache.org/licenses/LICENSE-2.0.html" ); return apiInfo; } /** * Configure a SwaggerApiResourceListing for each swagger instance within your app. e.g. 1. private 2. external apis * Required to be a spring bean as spring will call the postConstruct method to bootstrap swagger scanning. * * @return */ @Bean public SwaggerApiResourceListing swaggerApiResourceListing() { //The group name is important and should match the group set on ApiListingReferenceScanner //Note that swaggerCache() is by DefaultSwaggerController to serve the swagger json SwaggerApiResourceListing swaggerApiResourceListing = new SwaggerApiResourceListing(springSwaggerConfig.swaggerCache(), SWAGGER_GROUP); //Set the required swagger settings swaggerApiResourceListing.setSwaggerGlobalSettings(swaggerGlobalSettings()); //Use a custom path provider or springSwaggerConfig.defaultSwaggerPathProvider() swaggerApiResourceListing.setSwaggerPathProvider(apiPathProvider()); //Supply the API Info as it should appear on swagger-ui web page swaggerApiResourceListing.setApiInfo(apiInfo()); //Global authorization - see the swagger documentation swaggerApiResourceListing.setAuthorizationTypes(authorizationTypes()); //Every SwaggerApiResourceListing needs an ApiListingReferenceScanner to scan the spring request mappings swaggerApiResourceListing.setApiListingReferenceScanner(apiListingReferenceScanner()); return swaggerApiResourceListing; } @Bean /** * The ApiListingReferenceScanner does most of the work. * Scans the appropriate spring RequestMappingHandlerMappings * Applies the correct absolute paths to the generated swagger resources */ public ApiListingReferenceScanner apiListingReferenceScanner() { ApiListingReferenceScanner apiListingReferenceScanner = new ApiListingReferenceScanner(); //Picks up all of the registered spring RequestMappingHandlerMappings for scanning apiListingReferenceScanner.setRequestMappingHandlerMapping(springSwaggerConfig.swaggerRequestMappingHandlerMappings()); //Excludes any controllers with the supplied annotations apiListingReferenceScanner.setExcludeAnnotations(springSwaggerConfig.defaultExcludeAnnotations()); // apiListingReferenceScanner.setResourceGroupingStrategy(springSwaggerConfig.defaultResourceGroupingStrategy()); //Path provider used to generate the appropriate uri's apiListingReferenceScanner.setSwaggerPathProvider(apiPathProvider()); //Must match the swagger group set on the SwaggerApiResourceListing apiListingReferenceScanner.setSwaggerGroup(SWAGGER_GROUP); //Only include paths that match the supplied regular expressions apiListingReferenceScanner.setIncludePatterns(DEFAULT_INCLUDE_PATTERNS); return apiListingReferenceScanner; } /** * Example of a custom path provider */ @Bean public ApiPathProvider apiPathProvider() { ApiPathProvider apiPathProvider = new ApiPathProvider(docsLocation); apiPathProvider.setDefaultSwaggerPathProvider(springSwaggerConfig.defaultSwaggerPathProvider()); return apiPathProvider; } private List<AuthorizationType> authorizationTypes() { ArrayList<AuthorizationType> authorizationTypes = new ArrayList<>(); List<AuthorizationScope> authorizationScopeList = newArrayList(); authorizationScopeList.add(new AuthorizationScope("global", "access all")); List<GrantType> grantTypes = newArrayList(); LoginEndpoint loginEndpoint = new LoginEndpoint(apiPathProvider().getAppBasePath() +"/user/authenticate"); grantTypes.add(new ImplicitGrant(loginEndpoint, "access_token")); return authorizationTypes; } @Bean public SwaggerPathProvider relativeSwaggerPathProvider() { return new ApiRelativeSwaggerPathProvider(); } private class ApiRelativeSwaggerPathProvider extends DefaultSwaggerPathProvider { @Override public String getAppBasePath() { return "/"; } @Override public String getSwaggerDocumentationBasePath() { return "/api-docs"; } }}
ApiPathProvider.java file
package com.ucap.swagger;import com.mangofactory.swagger.core.SwaggerPathProvider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.util.UriComponentsBuilder;import javax.servlet.ServletContext;public class ApiPathProvider implements SwaggerPathProvider { private SwaggerPathProvider defaultSwaggerPathProvider; @Autowired private ServletContext servletContext; private String docsLocation; public ApiPathProvider(String docsLocation) { this.docsLocation = docsLocation; } @Override public String getApiResourcePrefix() { return defaultSwaggerPathProvider.getApiResourcePrefix(); } public String getAppBasePath() { return UriComponentsBuilder .fromHttpUrl(docsLocation) .path(servletContext.getContextPath()) .build() .toString(); } @Override public String getSwaggerDocumentationBasePath() { return UriComponentsBuilder .fromHttpUrl(getAppBasePath()) .pathSegment("api-docs/") .build() .toString(); } @Override public String getRequestMappingEndpoint(String requestMappingPattern) { return defaultSwaggerPathProvider.getRequestMappingEndpoint(requestMappingPattern); } public void setDefaultSwaggerPathProvider(SwaggerPathProvider defaultSwaggerPathProvider) { this.defaultSwaggerPathProvider = defaultSwaggerPathProvider; }}
Also, there is a property file in resources folder which contains:
app.docs=http://localhost:8080
When I am hitting "http://localhost:8080/api-docs" it neither gives any result nor any error, On google Rest the response code is 404.
Please help me on this.