com.hd123.oauth2.config.SwaggerConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for com.hd123.oauth2.config.SwaggerConfiguration.java

Source

package com.hd123.oauth2.config;

import static com.google.common.collect.Lists.newArrayList;
import static com.hd123.oauth2.common.ProfileConstants.UN_PRODUCTION;
import static org.apache.logging.log4j.LogManager.getLogger;
import static org.springframework.beans.factory.config.BeanDefinition.ROLE_SUPPORT;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static springfox.documentation.builders.PathSelectors.regex;
import static springfox.documentation.builders.RequestHandlerSelectors.any;
import static springfox.documentation.schema.AlternateTypeRules.newRule;
import static springfox.documentation.spi.DocumentationType.SWAGGER_2;

import java.util.Date;

import javax.inject.Inject;

import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.Role;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StopWatch;
import org.springframework.web.context.request.async.DeferredResult;

import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.schema.WildcardType;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import com.fasterxml.classmate.TypeResolver;

import com.hd123.oauth2.config.AppProperties.Swagger;
import com.hd123.oauth2.util.ProfileUtil;

/**
 * Springfox Swagger configuration.
 *
 * Warning! When having a lot of REST endpoints, Springfox can become a
 * performance issue. In that case, you can use a specific Spring profile for
 * this class, so that only front-end developers have access to the Swagger
 * view.
 * 
 * @author liyue
 */
@Configuration
@EnableSwagger2
@Profile(UN_PRODUCTION)
public class SwaggerConfiguration {

    private final Logger logger = getLogger(SwaggerConfiguration.class);

    @Inject
    private TypeResolver typeResolver;
    @Autowired
    private ProfileUtil profileUtil;
    @Autowired
    private AppProperties appProperties;

    /**
     * Swagger Springfox configuration.
     */
    @Bean
    @Role(ROLE_SUPPORT)
    @Profile(UN_PRODUCTION)
    @Description("Heading OAuth2 API Documentation")
    public Docket swaggerSpringfoxDocket() {
        final boolean debugAble = logger.isDebugEnabled();
        if (debugAble) {
            logger.debug("Starting Swagger");
        }
        final StopWatch watch = new StopWatch();
        watch.start();
        final ApiInfo apiInfo = apiInfo();
        final Docket docket = new Docket(SWAGGER_2).apiInfo(apiInfo).enable(!profileUtil.isProd())
                .enableUrlTemplating(false).forCodeGeneration(true).genericModelSubstitutes(ResponseEntity.class)
                .ignoredParameterTypes(Pageable.class)
                .directModelSubstitute(java.time.LocalDate.class, String.class)
                .directModelSubstitute(java.time.ZonedDateTime.class, Date.class)
                .directModelSubstitute(java.time.LocalDateTime.class, Date.class).useDefaultResponseMessages(false)
                .alternateTypeRules(newRule(
                        typeResolver.resolve(DeferredResult.class,
                                typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
                        typeResolver.resolve(WildcardType.class)))
                .globalResponseMessage(GET,
                        newArrayList(new ResponseMessageBuilder().code(500).message("Internal Server Error")
                                .responseModel(new ModelRef("Error")).build()))
                .select().apis(any()).paths(regex(appProperties.getSwagger().getApiPattern())).build();
        watch.stop();

        if (debugAble) {
            logger.debug("Started Swagger in {} ms", watch.getTotalTimeMillis());
        }

        return docket;
    }

    /**
     * ?
     *
     * @return ?
     */
    private ApiInfo apiInfo() {
        final Swagger swagger = appProperties.getSwagger();
        return new ApiInfo(swagger.getTitle(), swagger.getDescription(), swagger.getVersion(),
                swagger.getTermsOfServiceUrl(), swagger.getContact(), swagger.getLicense(),
                swagger.getLicenseUrl());
    }

}