Swagger-ui.html 访问不到的问题 Unable to infer base url. This is common when using dynamic ser 报错

文章讲述了在SpringBoot项目中如何移除Swagger启用条件,提供全局参数并优化Swagger配置,展示了如何创建Docket和ApiInfo实例。

swagger原来的配置类如下

/**
* @EnableSwaggerBootstrapUI swagger页面优化 使用时账密验证
* @EnableSwagger2 开启swagger
* swagger.enable 项目动态启用swagger
* @Author yanhongbo
*/
@Configuration
@EnableSwagger2
@ConditionalOnProperty(name = "swagger.enable", havingValue = "true")
public class SwaggerConfig {
 @Bean
 public Docket docket() {
 //可以通过此方式添加全局header
 /* ParameterBuilder parameterBuilder = new
ParameterBuilder();
 List<Parameter> heads = new ArrayList<>();
 parameterBuilder.name("token")
 .description("访问令牌")
 .modelRef(new ModelRef("string"))
 .parameterType("header")
 .required(false)
 .build();
 heads.add(parameterBuilder.build());*/
 return new Docket(DocumentationType.SWAGGER_2)
 .apiInfo(apiInfo())
 .genericModelSubstitutes(Response.class)
 .forCodeGeneration(true)
 .select()// 是否开启
.apis(RequestHandlerSelectors.basePackage("com.yuanma.user_boss.
controller")) // 扫描的路径包
 .paths(PathSelectors.any())// 指定路径处理
PathSelectors.any()代表所有的路径
 .build();
 // .globalOperationParameters(heads);
 }
 private ApiInfo apiInfo(){
 return new ApiInfoBuilder()
 .title("edu_boss采用swagger2集成和YApi使用示例")
 .description("采用swagger2")
 .termsOfServiceUrl("")//项目的ip
 .version("1.0")
 .build();
 }
}

解决方案:

需要去掉"@ConditionalOnProperty(name = "swagger.enable", havingValue = "true")"

package com.yuanma.common.swagger;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public Docket buildDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInfo())
                .select()
                // 要扫描的API(Controller)基础包
                .apis(RequestHandlerSelectors.basePackage("com.yuanma"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo buildApiInfo() {
        Contact contact = new Contact("九智新闻","","");
        return new ApiInfoBuilder()
                .title("九智新闻-平台管理API文档")
                .description("九智新闻后台api")
                .contact(contact)
                .version("1.0.0").build();
    }
}

访问链接如下:http://localhost:51801/swagger-ui.html#/ap_user

### 问题分析 在Spring与SpringMVC整合Swagger2时,出现“Unable to infer base url”错误,通常是由于Swagger无法正确推断API的基础URL。这种问题可能由以下原因引起: 1. 动态Servlet注册导致Swagger无法自动检测基础路径[^1]。 2. API网关或反向代理的存在干扰了Swagger对基础URL的解析[^1]。 3. 配置文件中未正确映射Swagger资源[^3]。 ### 解决方案 #### 方法一:手动设置基础URL 可以通过配置Swagger的Docket对象,手动指定基础路径。例如,在Swagger配置类中添加以下代码: ```java @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .host("example.org") // 手动设置主机名 .useDefaultResponseMessages(false) .select() .apis(RequestHandlerSelectors.basePackage("com.demo.controller")) // 替换为实际的包路径 .paths(PathSelectors.any()) .build(); } ``` 上述代码通过`.host()`方法手动设置了主机名,从而解决了基础URL无法推断的问题[^1]。 #### 方法二:在启动类中添加注解 确保启动类上添加了`@EnableSwagger2`注解,并扫描相关的配置文件夹。例如: ```java @SpringBootApplication @MapperScan("com.demo.system.mapper") @ComponentScan(value = "com.demo.config") @EnableSwagger2 public class HospitalApplication { public static void main(String[] args) { SpringApplication.run(HospitalApplication.class, args); } } ``` 此方法确保了Swagger的相关功能被正确启用,并能够扫描到配置文件中的资源[^2]。 #### 方法三:配置静态资源映射 如果Swagger的静态资源(如`swagger-ui.html`)无法正确加载,可以手动配置静态资源映射。在Spring的配置文件中添加以下内容: ```xml <mvc:resources mapping="/webjars/**" location="classpath*:/META-INF/resources/webjars/" /> <mvc:resources mapping="swagger-ui.html" location="classpath*:/META-INF/resources/" /> ``` 上述配置确保了SwaggerUI界面和相关资源能够正常加载[^3]。 #### 方法四:检查应用部署环境 如果应用部署在API网关或反向代理之后,需要确保网关或代理正确传递了请求头信息(如`X-Forwarded-Host`、`X-Forwarded-Proto`等)。例如,在Nginx中配置如下: ```nginx location /api/ { proxy_pass http://localhost:8080/; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto $scheme; } ``` 这样可以确保Swagger能够正确解析基础URL[^4]。 ### 注意事项 - 确保Swagger的版本与Spring Boot/SpringMVC的版本兼容。 - 如果使用Spring Boot 3.x,请将`@EnableSwagger2`替换为`@EnableOpenApi`,并引入`springdoc-openapi`依赖。 ### 示例代码 以下是一个完整的Swagger配置类示例: ```java @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .host("example.org") // 手动设置主机名 .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.demo.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("API文档") .description("SpringMVC与Swagger2集成示例") .version("1.0.0") .build(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值