swagger-ui和springboot项目结合+springboot静态资源映射

本文详细介绍如何在SpringBoot项目中使用Swagger生成RESTful API文档,包括依赖导入、配置类编写、界面汉化及常见问题解决。同时,介绍了Swagger注解的使用方法,帮助开发者快速上手。

swagger-ui:

  • Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 总体目标是使客户端和文件系统作为服务器以同样的速度来更新。 文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。
    官网:https://swagger.io/springfox
  • 大致原理: springfox的大致原理就是,在项目启动的过种中,spring上下文在初始化的过程,框架自动跟据配置加载一些swagger相关的bean到当前的上下文中,并自动扫描系统中可能需要生成api文档那些类,并生成相应的信息缓存起来。如果项目MVC控制层用的是springMvc那么会自动扫描所有Controller类,并生成对应的文档描述数据.该数据是json格式,通过路径:项目地址/ v2/api-docs可以访问到该数据,然后swaggerUI根据这份数据生成相应的文档描述界面。因为我们能拿到这份数据,所以我们也可以生成自己的页面.springboot和swagger使用
  1. 新建项目导入依赖
          	  <dependency>           
	             <groupId>io.springfox</groupId>           
	              <artifactId>springfox-swagger2</artifactId>            
	              <version>2.7.0</version>        
              </dependency>        
              <dependency>            
	              <groupId>io.springfox</groupId>           
	               <artifactId>springfox-swagger-ui</artifactId>           
	                <version>2.7.0</version>        
                </dependency>
  1. 配置swagger配置类

@Configuration
@EnableSwagger2
public class SwaggerConfig{    @Bean    public Docket createRestApi() {        
	return new Docket(DocumentationType.SWAGGER_2)                
		.apiInfo(apiInfo())                
		.select()
		.apis(RequestHandlerSelectors.basePackage("com.aaa.dogs.cats"))
		.paths(PathSelectors.any())                
		.build();    
}    

private ApiInfo apiInfo() {        
	return new ApiInfoBuilder()
		.title("Spring Boot中使用Swagger2构建RESTful API")
		.description("rest api 文档构建利器")
		.termsOfServiceUrl("https://blog.youkuaiyun.com/qq_38371367")
		.contact("飞客不去")
		.version("1.0")
		.build();    }} 

配置好之后,项目启动会自动扫描指定的包,如果使用springMVC,则会扫描配置包下的所有的controller层的方法,将所有的接口暴露出来生成文档,只需要访问:项目地址/swagger-ui.html,就可以看到swagger-ui界面,看到所有的接口信息。

swagger-ui界面中文化

参考博客:(https://blog.youkuaiyun.com/itguangit/article/details/78978296)
Spring Boot 默认“约定”从资源目录的这些子目录读取静态资源(优先级从上到下)

	1. src/main/resources/META-INF/resources
	2. src/main/resources/static (推荐)
	3. src/main/resources/public
  1. 之前引入的 springfox-swagger-ui 这个包
    在这里插入图片描述

在浏览器看到的swagger-ui就是此页面。
2. 我们想要中文版的,根据官方提供的方法只需要按照此目录结构,在项目下构建相同目录结构,就可以实现覆盖,我们也不能直接在这里修改源码啊,还记 得我们前面提到的 Spring boot 资源目录的优先级吗? 没错,我们只需要在记得项目下创建 META-INF 这个资源目录就行啊
在这里插入图片描述

  1. Spring boot 默认会把我们项目的 src/main/resources/META-INF/resources 覆盖其它的依赖下的文件. 在自己项目中的swagger-ui.html文件中添加两句话在head标签的内部最下面就行
<script src='webjars/springfox-swagger-ui/lang/translator.js' type='text/javascript'></script> 
<script src='webjars/springfox-swagger-ui/lang/zh-cn.js' type='text/javascript'></script>          
  1. 在zh-cn.js里面可以看到,页面英文对应的中文,还支持自己修改自定义

Swagger常用注解

  • @Api: 描述类/接口的主要用途

  • @ApiOperation: 描述方法用途

  • @ApiImplicitParam: 描述方法的参数

  • @ApiImplicitParams: 描述方法的参数(Multi-Params)

    可以在上面 创建用户的方法上添加 @ApiImplicitParam(name = “user”, value = “用户详细实体user”, required = true, dataType = “User”)试试看.

  • @ApiParam:请求属性

  • @ApiIgnore: 忽略某类/方法/参数的文档

    注意与 @ApiModelProperty(hidden = true)不同, @ApiIgnore 不能用在模型数据上

  • @ApiResponse:响应配置

    如: @ApiResponse(code = 400, message = “无效的用户信息”) ,注意这只是在 生成的Swagger文档上有效,不要和实际的客户端调用搞混了. 通常我们都是统一JSON返回,用不到这个注解

  • @ApiResponses:响应集配置

  • @ResponseHeader: 响应头设置

    例如: @ResponseHeader(name=”head1”,description=”response head conf”)

  • @ApiModelProperty:添加和操作模型属性的数据

SpringBoot静态文件问题

参考博客:(https://www.cnblogs.com/xbq8080/p/7774856.html):

  1. Spring Boot 默认“约定”从资源目录的这些子目录读取静态资源(优先级从上到下)
	1. src/main/resources/META-INF/resources
	2. src/main/resources/static (推荐)
	3. src/main/resources/public
  1. 配置文件配置静态资源以及映射(自定义)
spring 
	mvc: 
		static-path-pattern: /image/**     
	resources:       
		static-locations: file:H:/aaa/image/

以上配置表示在url中访问:/image/** ;映射器会去找磁盘下的H:/xlauncher/image/中的资源,也可以配置成classpath:aaa/image/
3. 在配置文件中这样配置是不推荐的,因为项目这样配置,会造成修改springboot的默认静态资源映射以及打包资源丢失,所以还有一种更优方式来处理这种映射,并且不会覆盖springboot:

 继承 WebMvcConfigurerAdapter 并重写方法 addResourceHandlers
 /*** 自定义静态文件 映射*/
 @Configuration
 public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {    

	@Override    
	public void addResourceHandlers(ResourceHandlerRegistry registry) {                
	//支持:file:/var/lib/tomcat/webapps/xlauncher/image/        
	//支持:classpath:/img1/     
	registry.addResourceHandler("/image/**")
	.addResourceLocations("file:/var/lib/aaa/image/"); 
	super.addResourceHandlers(registry);    }}
  1. maven打包方式选择:

    1. maven打包方式可以自定义
    	<build>
    		<resources>
    			<resource>
    				<directory>src/main/java</directory>
    				<includes>
    					<include>**/*.xml</include>
    				</includes>
    				<filtering>false</filtering>
    			</resource>
    			<resource>
    				<directory>src/main/resources</directory>
    				<includes>
    					<include>**/*.yml</include>
    				</includes>
    				<filtering>false</filtering>
    			</resource>
    			<resource>
    				<directory>src/main/resources</directory>
    				<includes>
    					<include>**/*.xml</include>
    				</includes>
    				<filtering>false</filtering>
    			</resource>
    		</resources>
    	</build>
    
    1. 也可以直接使用插件,让springboot去管理资源文件
    		<plugin>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-maven-plugin</artifactId>
    		</plugin>
    
    

问题总结:

  1. 导入依赖,编写配置类后,访问:项目地址/+swagger-ui.html 报错404
    原因:
    1. 在配置文件自定义了静态资源位置
    2. swagger配置类下没有swagger资源,即没有controller接口,或者不是springMVC
    解决:
    1. 使用配置类来做静态资源映射,不修改覆盖springBoot的静态资源映射
    2. 检查配置类中指定的扫包
  2. 汉化失败:
    1. 打包方式问题,应该只选择默认打包插件方式
    2. 文件夹目录没有对应

感谢参考博客:
https://blog.youkuaiyun.com/itguangit/article/details/78978296
https://www.cnblogs.com/xbq8080/p/7774856.html

<think>好的,我现在要解决用户在Spring Boot项目中引入Swagger后访问swagger-ui.html出现404的问题。根据用户提供的引用内容,我需要综合这些信息,给出有效的解决方案。 首先,用户提到了多个可能的原因解决方法。我需要逐一分析这些引用中的建议,并整理出步骤清晰的解决方案。 根据引用[1]、[3]、[5],用户可能没有正确添加依赖。比如,用户可能只添加了swagger2而没有swagger-ui,或者版本不一致。因此,检查依赖是否正确是第一步。引用[4]提到使用springfox-boot-starter 3.0.0,这可能是一个更简单的解决方案,因为它可能自动包含所需的依赖。不过,用户需要注意版本兼容性,特别是Spring Boot的版本是否支持Swagger的版本。 接下来,引用[2][4]都提到了配置类的问题。在SwaggerConfig类中添加资源处理器(ResourceHandlerRegistry)是必要的,因为Spring Boot可能没有正确映射Swagger静态资源。这需要用户自定义配置类,并确保添加了正确的资源路径。 另外,引用[2]中的代码示例展示了如何覆盖addResourceHandlers方法,将/swagger-ui.html/webjars/**映射到正确的classpath位置。这可能是因为在Spring Boot 2.X版本中,默认的资源处理方式有所改变,需要手动配置。 另外,用户可能没有启用Swagger的注解,比如在配置类上使用@EnableSwagger2或@EnableSwagger2WebMvc。这可能导致Swagger的端点没有被正确注册。 还需要检查Spring Boot的版本与Swagger版本是否兼容。例如,引用[4]提到的springfox-boot-starter 3.0.0可能需要Spring Boot 2.2以上版本。如果用户使用的是旧版Spring Boot,可能需要降级Swagger版本。 此外,项目的包结构也可能影响组件的扫描。如果Swagger配置类不在主应用程序类的子包下,可能需要手动配置扫描路径,或者使用@ComponentScan注解。 还有可能用户没有正确配置路径,比如访问的URL是否正确。正确的访问路径应该是http://localhost:端口/swagger-ui.html,而有时候可能需要添加项目上下文路径,特别是在部署到服务器时。 此外,安全配置(如Spring Security)可能会拦截Swagger的请求,需要放行相关路径。例如,在安全配置中允许/swagger-ui.html/webjars/**的访问。 总结可能的解决步骤: 1. 检查依赖是否正确,尤其是swagger2swagger-ui的版本是否一致,或者是否使用springfox-boot-starter。 2. 创建Swagger配置类,并添加资源处理器。 3. 启用Swagger注解,如@EnableSwagger2。 4. 检查包结构,确保配置类被扫描到。 5. 调整安全配置,允许访问Swagger相关路径。 6. 验证访问URL是否正确,包括端口上下文路径。 需要注意,不同版本的Swagger可能有不同的配置方式,特别是SpringfoxSpringDoc之间的区别。例如,如果用户使用的是Spring Boot 3.x,可能需要切换到SpringDoc OpenAPI,因为Springfox可能不再兼容。 最后,可能需要清除Maven缓存并重新构建项目,确保依赖正确下载。</think>### Spring Boot中解决swagger-ui.html 404问题的逐步方案 #### 1. 检查依赖配置(关键步骤) 确保`pom.xml`中同时包含**swagger2****swagger-ui**依赖,且版本一致: ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> ``` 或使用**简化依赖**(Spring Boot 2.2+推荐)[^4]: ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> ``` #### 2. 创建Swagger配置类 新建`SwaggerConfig.java`,添加资源映射注解支持: ```java @Configuration @EnableSwagger2 // 或@EnableSwagger2WebMvc public class SwaggerConfig extends WebMvcConfigurationSupport { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("你的Controller包路径")) .paths(PathSelectors.any()) .build(); } @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } } ``` #### 3. 验证包扫描范围 确认配置类所在包位于**主启动类同级或子目录**。若不在,需添加扫描注解: ```java @SpringBootApplication @ComponentScan({"com.example.main","com.example.swagger"}) // 手动指定扫描范围 public class Application { ... } ``` #### 4. 检查安全配置 如果项目集成了Spring Security,需放行Swagger路径: ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/swagger-ui.html", "/webjars/**", "/v2/api-docs").permitAll() ... } } ``` #### 5. 验证访问地址 正确访问路径应为: ``` http://localhost:端口/swagger-ui.html ``` 若配置了`server.servlet.context-path`,需追加上下文路径: ``` http://localhost:端口/上下文路径/swagger-ui.html ``` #### 6. 版本兼容性检查 - Spring Boot 2.6+需添加配置解决路径匹配策略问题: ```properties spring.mvc.pathmatch.matching-strategy=ant_path_matcher ``` - Spring Boot 3.x需改用**SpringDoc OpenAPI**(Springfox已停止维护)[^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值