Swagger-v2 & v3 说明配置

本文详细介绍了Swagger的注解使用,包括@Api、@ApiOperation等,以及Swagger2和Swagger3的配置方法,展示了如何在Controller、方法、实体类上添加注解,并提供了接收不同类型参数的示例。同时,还提到了使用swagger-bootstrap-ui的相关信息。
摘要由CSDN通过智能技术生成

注意

spring-boot 版本 >= 2.6.x 的 swagger 配置请看这里: 🐱‍🚀

一、注解说明

Swagger 使用的注解及其说明:

作用于-Controller类

@Api

@Api:用在类上,说明该类的作用。

@Api(value = "代码生成", tags = "代码生成")
public class TestController{}

作用于-方法

@ApiOperation:给方法增加说明。

@ApiOperation(value = "获取用户列表", notes = "获取用户列表")
public R userList() {}

value:显示在 Controller 里面

tags:显示在 Controller 外部

@ApiOperation(value = "添加学生", tags = "添加学生")
@ApiOperation(value = "删除学生", tags = "删除学生")

@ApiOperation(value = "获取学生list")
@ApiOperation(value = "获取学生by ID")

在这里插入图片描述

@RequestBody 接收对象传参

@PostMapping("/add")
@ResponseStatus(HttpStatus.CREATED)
@ApiOperation(value = "新增用户", notes = "新增用户")
public void addUser(@RequestBody User user) {
    logger.info("LandLord DTO is: "+user);
}

@ApiImplicitParam:给方法参数增加说明。

@ApiOperation(value = "获取用户详细", notes = "获取用户详细")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, paramType = "path", dataType = "Integer", dataTypeClass = Integer.class)
public R getUser(@PathVariable Integer userId) {}
参数说明
name: String参数名
value: String参数说明&描述
defaultValue: String参数的默认值
required: boolean参数是否必须传
dataType: String参数类型
paramType: String指定参数放在哪个地方。
header:请求参数放置于RequestHeader,使用 @RequestHeader 获取
query:请求参数放置于请求地址,使用 @RequestParam 获取
path:(用于 restful 接口)使用 @PathVariable 获取
body:(不常用)
form(不常用)

@ApiImplicitParams : 用在方法上包含一组参数说明。

 @ApiImplicitParams({
    @ApiImplicitParam(paramType = "query", name = "username", value = "用户名", required = true, defaultValue = "test"),
    @ApiImplicitParam(paramType = "query", name = "password", value = "密码", required = true, defaultValue = "123")
 })
 @PostMapping("/user")
 public String addUser(@RequestParam String username, @RequestParam String password) {
     return "新增用户:" + username + " " + password;
 }

接收 参数&对象组合

    @ApiOperation(value="修改医生信息", notes="")
    @ApiImplicitParam(paramType="query", name = "doctorId", value = "医生ID", required = true, dataType = "Integer")
    public String updateDoctor(@RequestParam Integer doctorId, @RequestBody DemoDoctor doctor){}

接收 参数&header组合

    @ApiImplicitParams({
        @ApiImplicitParam(paramType="header", name = "token", value = "token", required = true, dataType = "String"),
        @ApiImplicitParam(paramType="query", name = "pageIndex", value = "当前页数", required = false, dataType = "String"),
        @ApiImplicitParam(paramType="query", name = "pageSize", value = "每页记录数", required = true, dataType = "String"),
    })
    public PageInfo<DemoDoctor> getDoctorList(@RequestParam(value = "pageIndex", required = false, defaultValue = "1") Integer pageIndex,
            @RequestParam(value = "pageSize", required = false) Integer pageSize,
            HttpServletRequest request){}

@ApiResponses:用于表示一组响应

@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信

code:数字,例如400

message:信息,例如"请求参数没填好"

response:抛出异常的类

@ApiOperation(value = "删除用户", notes = "根据 id 删除用户")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Integer", paramType = "path", dataTypeClass = Integer.class)
@ApiResponses({
      @ApiResponse(code = 200, message = "删除成功!"),
      @ApiResponse(code = 500, message = "删除失败!")
})
public R delete(@PathVariable Integer id) {}

注意:

在@RequestMapper中必须指定RequestMethod的类型,否则Sawgger会默认为全类型皆可访问, API列表中会生成多条项目。

作用于-实体类

@ApiModel:描述一个Model的信息

(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)

@ApiModel(value = "UserEntity", description = "用户实体")
public class UserEntity {}

@ApiModelProperty:描述一个model的属性

@ApiModelProperty(value = "用户ID")
private Integer userId;

二、swagger2 配置

在这里插入图片描述
在这里插入图片描述

        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>25.1-jre</version>
        </dependency>
/**
 * Swagger2 的接口配置
 *
 * @author jf
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
    /**
     * 系统基础配置
     */
    @Autowired
    private ModelConfig modelConfig;

    /**
     * 是否开启swagger
     */
    @Value("${swagger.enabled}")
    private boolean enabled;

    /**
     * 设置请求的统一前缀
     */
    @Value("${swagger.pathMapping}")
    private String pathMapping;

    /**
     * 分组:sys管理
     *
     * @return Docket
     */
    @Bean
    public Docket sys_api_app() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 是否启用Swagger
                .enable(enabled)
                .apiInfo(apiInfo("标题:学生管理_API", "学生"))
                .select()
                .apis(RequestHandlerSelectors.basePackage("cn.springboot.model.web.controller"))
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // .apis(RequestHandlerSelectors.any())
//                .paths(PathSelectors.any())
                .paths(PathSelectors.ant("/stu/**"))
                .build()
                .groupName("学生")
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                .pathMapping(pathMapping);
    }

    @Bean
    public Docket clas_api_app() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 是否启用Swagger
                .enable(enabled)
                .apiInfo(apiInfo("标题:班级管理_API", "班级"))
                .select()
                .apis(RequestHandlerSelectors.basePackage("cn.springboot.model.web.controller"))
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // .apis(RequestHandlerSelectors.any())
//                .paths(PathSelectors.any())
                .paths(PathSelectors.ant("/class/**"))
                .build()
                .groupName("班级")
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                .pathMapping(pathMapping);
    }

    /**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
        return apiKeyList;
    }

    /**
     * 安全上下文
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(o -> o.matches("/.*"))
                        .build());
        return securityContexts;
    }

    /**
     * 默认的安全上引用
     */
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }

    /**
     * 构建api文档的详细信息
     *
     * @param title       标题
     * @param description 描述
     * @return ApiInfo
     */
    private ApiInfo apiInfo(String title, String description) {
        return new ApiInfoBuilder()
                .title(title)
                .description(description)
                // 作者信息
                .contact(new Contact(modelConfig.getName(), null, null))
                .version("版本号:" + modelConfig.getVersion())
                .build();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        registry.addResourceHandler("/static/**")
                .addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/static/");
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }
}

三、swagger3 配置

在这里插入图片描述

<!-- Swagger3依赖 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-models</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.6.2</version>
        </dependency>
/**
 * Swagger 的接口配置
 *
 */
@Configuration
public class SwaggerConfig {
    
    @Value("${project.name}")
    private String name;
    
    @Value("${project.version}")
    private String version;
    
    /**
     * 是否开启swagger
     */
    @Value("${swagger.enabled}")
    private boolean enabled;

    /**
     * 设置请求的统一前缀
     */
    @Value("${swagger.pathMapping}")
    private String pathMapping;


    /**
     * 分组:sys管理
     *
     * @return Docket
     */
    @Bean
    public Docket sys_api_app() {
        return new Docket(DocumentationType.OAS_30)
                // 是否启用Swagger
                .enable(enabled)
                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
                .apiInfo(apiInfo("标题:系统管理模块_API", "system"))
                // 设置哪些接口暴露给Swagger展示
                .select()
/扫描
                .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.system.controller"))
                //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // .apis(RequestHandlerSelectors.any())
/请求路径
                //.paths(PathSelectors.any())
                .paths(PathSelectors.ant("/system/**"))
                .build()
/设置安全模式,swagger可以设置访问token
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                .groupName("system")
                .pathMapping(pathMapping);
    }

    /**
     * 分组: tool 管理
     *
     * @return Docket
     */
    @Bean
    public Docket tool_api_app() {
        return new Docket(DocumentationType.OAS_30)
                .enable(enabled)
                .apiInfo(apiInfo("标题:系统工具模块_API", "tool"))
                .select()
            .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.gen.controller"))
                .paths(PathSelectors.ant("/tool/**"))
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                .groupName("tool")
                .pathMapping(pathMapping + "/tool");
    }

    /**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
        return apiKeyList;
    }

    /**
     * 安全上下文
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
                        .build());
        return securityContexts;
    }

    /**
     * 默认的安全上引用
     */
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }

    /**
     * 构建api文档的详细信息
     *
     * @param title       标题
     * @param description 描述
     * @return ApiInfo
     */
    private ApiInfo apiInfo(String title, String description) {
        return new ApiInfoBuilder()
                .title(title)
                .description(description)
                // 作者信息
                .contact(new Contact(name, null, null))
                .version("版本号:" + version)
                .build();
    }
}

四、使用 swagger-bootstrap-ui

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>1.9.6</version>
</dependency>

Swagger 文档: http://192.168.56.1:51156/dev/doc.html

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您已经确认添加了swagger2的依赖,但是访问swagger-ui.html时仍然出现404错误,可以尝试以下解决方法: 1. 检查是否在配置类上添加了`@EnableSwagger2`注解,这个注解是启用swagger2的关键,如果没有添加这个注解,swagger2将无法正常工作。 2. 检查是否已经正确配置swagger2的相关信息,包括文档标题、版本、描述等信息。如果这些信息没有正确配置,可能会导致swagger-ui.html无法正常显示。 3. 确认是否已经在配置类上添加了`@EnableWebMvc`注解,如果添加了这个注解,可能会导致静态资源无法正常访问。如果您添加了这个注解,请尝试将其删除,然后重新启动应用程序。 4. 检查是否正确配置了静态资源访问路径。如果没有正确配置静态资源访问路径,将无法访问swagger-ui.html文件。您可以在`application.properties`或`application.yml`文件中添加以下配置: ```yaml spring.mvc.static-path-pattern=/static/** spring.resources.static-locations=classpath:/static/ ``` 这样配置后,可以将swagger-ui.html文件放在`/static/`目录下。 5. 如果您的项目使用了Spring Security等安全框架,可能需要在安全配置类中添加以下内容: ```java @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/swagger-ui.html"); } ``` 这样配置后,可以忽略对swagger-ui.html的安全验证,从而正常访问swagger-ui.html文件。 希望这些解决方法对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值