因为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);
}
}