亲测使用 swagger 动态修改后台默认访问地址 swagger-ui.html

因为swagger有需要随着生产环境一起上线。所以接口的后台地址修改就成了必要的事情。
百度搜出来的东西太同质化了,最后自己捣鼓了半天才搞定。

只需一步:创建自己的controller处理swagger的请求

${adminUrl}参数取自配置文件

package cc.pandacms.web.admin;

import cc.pandacms.services.common.panda.PandaConfig;
import cc.pandacms.utils.common.LogUtil;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import io.swagger.models.Swagger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponents;
import springfox.documentation.service.Documentation;
import springfox.documentation.spring.web.DocumentationCache;
import springfox.documentation.spring.web.PropertySourcedMapping;
import springfox.documentation.spring.web.json.Json;
import springfox.documentation.spring.web.json.JsonSerializer;
import springfox.documentation.swagger.common.HostNameProvider;
import springfox.documentation.swagger.web.ApiResourceController;
import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * author: WasonCheung
 * project: cc-pandacms
 * blog: http://zjhblog.cc
 * date: 2021/8/6 16:10
 * ClassName: SwaggerController
 * Description: ...
 */
@Controller
public class SwaggerController {
    private final String hostNameOverride;
    private final DocumentationCache documentationCache;
    private final ServiceModelToSwagger2Mapper mapper;
    private final JsonSerializer jsonSerializer;
    @Autowired
    private ApiResourceController apiResourceController;

    @Autowired
    public SwaggerController(Environment environment, DocumentationCache documentationCache, ServiceModelToSwagger2Mapper mapper, JsonSerializer jsonSerializer) {
        this.hostNameOverride = environment.getProperty("springfox.documentation.swagger.v2.host", "DEFAULT");
        this.documentationCache = documentationCache;
        this.mapper = mapper;
        this.jsonSerializer = jsonSerializer;
    }


    @RequestMapping(value = {"${adminUrl}/v2/api-docs"}, method = {RequestMethod.GET}, produces = {"application/json", "application/hal+json"})
    @PropertySourcedMapping(value = "${springfox.documentation.swagger.v2.path}", propertyKey = "springfox.documentation.swagger.v2.path")
    @ResponseBody
    public ResponseEntity<Json> getDocumentation(@RequestParam(value = "group",required = false) String swaggerGroup, HttpServletRequest servletRequest) {
        String groupName = (String) Optional.fromNullable(swaggerGroup).or("default");
        Documentation documentation = this.documentationCache.documentationByGroup(groupName);
        if (documentation == null) {
            LogUtil.warn("Unable to find specification for group {}", groupName);
            return new ResponseEntity(HttpStatus.NOT_FOUND);
        } else {
            Swagger swagger = this.mapper.mapDocumentation(documentation);
            UriComponents uriComponents = HostNameProvider.componentsFrom(servletRequest, swagger.getBasePath());
            swagger.basePath(Strings.isNullOrEmpty(uriComponents.getPath()) ? "/" : uriComponents.getPath());
            if (Strings.isNullOrEmpty(swagger.getHost())) {
                swagger.host(this.hostName(uriComponents));
            }

            return new ResponseEntity(this.jsonSerializer.toJson(swagger), HttpStatus.OK);
        }
    }
    private String hostName(UriComponents uriComponents) {
        if ("DEFAULT".equals(this.hostNameOverride)) {
            String host = uriComponents.getHost();
            int port = uriComponents.getPort();
            return port > -1 ? String.format("%s:%d", host, port) : host;
        } else {
            return this.hostNameOverride;
        }
    }

    @GetMapping("${adminUrl}/swagger")
    @ResponseBody
    public String swagger(HttpServletRequest request,HttpServletResponse response){
        return PandaConfig.PANDA_NAME+" swagger api";
    }

    /***
     * @Date : 2021/8/7 23:54
     * @author : wasonCheung
     * @return : java.lang.String
    * @Description : swagger首页访问
    */
    @GetMapping("${adminUrl}/swagger-ui.html")
    public String index(HttpServletRequest request,HttpServletResponse response){
        return "swagger-ui";
    }

    @GetMapping("${adminUrl}/csrf")
    public void csrf(HttpServletRequest request, HttpServletResponse response){

    }


    @RequestMapping({"${adminUrl}/swagger-resources/configuration/security"})
    @ResponseBody
    public ResponseEntity<SecurityConfiguration> securityConfiguration() {
        return apiResourceController.securityConfiguration();
    }

    @RequestMapping({"${adminUrl}/swagger-resources/configuration/ui"})
    @ResponseBody
    public ResponseEntity<UiConfiguration> uiConfiguration() {
        return apiResourceController.uiConfiguration();
    }


    @GetMapping("${adminUrl}/swagger-resources")
    @ResponseBody
    public ResponseEntity<List<SwaggerResource>> swaggerResources() {
        return apiResourceController.swaggerResources();
    }
 
 	@GetMapping("${adminUrl}/webjars/**")
    public void resourcesHandler(HttpServletRequest request,HttpServletResponse response) {
        PandaDispatcher.resourcesDispatcher(request.getServletPath().replace(adminUrl,""),request,response);
    }

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值