package com.mycompany.myapp.apidoc; 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.SwaggerApiResourceListing; import com.mangofactory.swagger.scanners.ApiListingReferenceScanner; import com.wordnik.swagger.model.ApiInfo; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import javax.inject.Inject; import java.util.Arrays; import java.util.List; @Configuration @ComponentScan(basePackages = "com.mangofactory.swagger") public class SwaggerConfiguration implements EnvironmentAware { public static final List<String> DEFAULT_INCLUDE_PATTERNS = Arrays.asList("/app/rest/.*"); public static final String SWAGGER_GROUP = "csrfhipster-api"; private RelaxedPropertyResolver propertyResolver; @Override public void setEnvironment(Environment environment) { this.propertyResolver = new RelaxedPropertyResolver(environment, "swagger."); } @Inject private SpringSwaggerConfig springSwaggerConfig; @Inject 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() { return new ApiInfo( propertyResolver.getProperty("title"), propertyResolver.getProperty("description"), propertyResolver.getProperty("termsOfServiceUrl"), propertyResolver.getProperty("contact"), propertyResolver.getProperty("license"), propertyResolver.getProperty("licenseUrl")); } /** * 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 the SwaggerApiResourceListing */ @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()); //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(propertyResolver.getProperty("apiDocsLocation")); apiPathProvider.setDefaultSwaggerPathProvider(springSwaggerConfig.defaultSwaggerPathProvider()); return apiPathProvider; } }