Quantcast
Channel: Active questions tagged rest - Stack Overflow
Viewing all articles
Browse latest Browse all 3637

"404 Not Found" when viewing swagger api-docs when using swagger-springmvc (now springfox)

$
0
0

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.


Viewing all articles
Browse latest Browse all 3637

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>