SpringBoot2.x整合Swagger2构建接口文档及问题

SpringBoot2.x整合Swagger2

1、项目环境

SpringBoot:2.3.4
Swagger2:2.2.2
jdk:1.8

2、添加Swagger2依赖

在pom.xml中添加Swagger2依赖:

<!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.2.2</version>
        </dependency>

3、创建Swagger2的配置类

package com.zbh.studys.config;

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.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @ClassName SwaggerConfig
 * @Description TODO
 * @Author 
 * @Date 2020/10/15 9:07
 **/
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi(){
    	// DocumentationType.SWAGGER_2:告诉Docketbean使用的Swagger规范版本2
        return new Docket(DocumentationType.SWAGGER_2)
                // 指定构建api文档的详细信息的方法
                .apiInfo(apiInfo())
                // 用于定义那些控制器及其生成的文档中应包含那些方法
                .select()
                // 指定要生成api接口的包路径,这里把controller作为包路径,生成controller中的所有接口
                .apis(RequestHandlerSelectors.basePackage("com.zbh.studys.controller"))
                // 允许根据路径映射定义应包含那个控制器的方法,PathSelectors.any()代表匹配所有的URL,但你可以使用正则表达式来限制。
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 构建api文档的详细信息
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // 设置页面标题
                .title("Spring Boot搭建实际项目中开发的架构")
                // 设置接口描述
                .description("练习Spring Boot课程")
                // 设置联系方式
                .contact("作者")
                // 设置版本
                .version("1.0")
                // 构建
                .build();
    }

}

4、将Swagger Core注释添加到模型类中

package com.zbh.studys.Entiy;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
 * @ClassName User
 * @Description TODO
 * @Author zhangbh
 * @Date 2020/10/15 9:23
 **/
 // 定义在类级别上
@ApiModel(description = "用户实体类")
public class User {

	/**
	* 定义在字段级别上,该注解对于提供示例值非常有用,这不仅适用于用户的指导,
	* 而且还可以在使用Swagger UI作为REST客户端来测试服务时预填充请求有效负载。
	* position指定属性在文档中显示的顺序,
	* 首先提供重要或必需的属性或属于一起的组属性是有用的,
	* 否则属性将按照字母顺序列出。
	* /
    @ApiModelProperty(value = "用户ID", position = 0)
    private Long id;
    @ApiModelProperty(value = "用户名称", position = 1)
    private String username;
    @ApiModelProperty(value = "用户密码", position = 2)
    private String password;

5、将Swagger Core注释添加到控制类中

package com.zbh.studys.controller;

import com.zbh.studys.Entiy.User;
import com.zbh.studys.result.JsonResult;
import com.zbh.studys.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @ClassName UserController
 * @Description TODO
 * @Author zhangbh
 * @Date 2020/10/15 9:18
 **/
@RestController
@Api(value = "用户信息接口")	// 描述整个控制器
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/getUser/{id}")
    @ApiOperation(value = "根据用户唯一标识获取用户信息")	//  用于方法级别的描述
    // @ApiParam 用于方法参数的描述
    public JsonResult<User> getUserInfo(@PathVariable @ApiParam(value = "用户唯一标识") Long id){
        User user = new User(id, "XXX", "123456");
        return new JsonResult<>(user);
    }
}

配置到此结束,此时是可以启动应用并使用Swagger的,但可也有可能会遇到一些问题。

SpringBoot2.x整合Swagger2可能出现的问题

问题一:

启动失败,报这个错误Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed,详细错误如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguration required a single bean, but 15 were found:
	- modelBuilderPluginRegistry: defined in null
	- modelPropertyBuilderPluginRegistry: defined in null
	- typeNameProviderPluginRegistry: defined in null
	- documentationPluginRegistry: defined in null
	- apiListingBuilderPluginRegistry: defined in null
	- operationBuilderPluginRegistry: defined in null
	- parameterBuilderPluginRegistry: defined in null
	- expandedParameterBuilderPluginRegistry: defined in null
	- resourceGroupingStrategyRegistry: defined in null
	- operationModelsProviderPluginRegistry: defined in null
	- defaultsProviderPluginRegistry: defined in null
	- pathDecoratorRegistry: defined in null
	- relProviderPluginRegistry: defined by method 'relProviderPluginRegistry' in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]
	- linkDiscovererRegistry: defined in null
	- entityLinksPluginRegistry: defined by method 'entityLinksPluginRegistry' in class path resource [org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed


Process finished with exit code 1

报这个错误是因为,SpringBoot版本太高或者swagger版本太低了导致的,就比如我使用的是SpringBoot2.3.4,Swagger2.2.2,这个就不行。可以将SpringBoot改成2.0.3或者将Swagger改成2.9.2就可以了。

<!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

问题二:

我们在启动后,在浏览器输入http://localhost:8080/swagger-ui.html时可能会报404错误,这个问题是因为我们的项目是纯restful前后端分离的项目,可能会无法访问静态资源,可以修改一下SwaggerConfig配置类,来做一下映射关系。

@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 解决swagger无法访问
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        // 解决swagger的js文件无法访问
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

    }

问题三:

还有一个问题,暂时复现不了,就先不详细写了,等遇到了再详细写。大致先说一下这个问题,就是类型转换错误,‘java.lang.NumberFormatException: For input string: " "’。原因是因为:io.springfox:springfox-swagger2:2.9.2这个包下的swagger-modelsde的版本是1.5.10,可以排除这个依赖,添加高版本的依赖即可。

<!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
            <exclusions>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-models</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.5.21</version>
        </dependency>

        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.21</version>
        </dependency>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值