首页 > 编程语言 >Java Spring Boot 集成 Swagger 生成 API文档(SpringDoc)

Java Spring Boot 集成 Swagger 生成 API文档(SpringDoc)

时间:2023-12-18 14:33:28浏览次数:35  
标签:code Java Spring Boot return import swagger public RespInfo

在我们进行项目开发的时候,有些文档是必不可少的,或者也有利于自己查阅,比如 API接口文档。

在 Spring Boot 中通常有有个选择:

  • springfox
  • springdoc

因为 springfox和 Spring Boot 版本适配问题是个坑,这里我们选用更加友好的 springDoc,而且用起来更顺手,很丝滑。

以下是环境:

  • Spring Boot:3.1.6
  • JDK:17

依赖

以下项目中用到的依赖:

<!--   swagger     -->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
</dependency>

<!--  lombok for class    -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
</dependency>

<!--  params validate -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

配置

我们在项目中应用也很简单,首先配置 swagger:

package com.example.swaggerdemo;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenApiConfig {

    @Bean
    public OpenAPI springOpenAPI() {
        return new OpenAPI().info(new Info() //
                .title("SpringDoc API Demo") //
                .description("SpringDoc Simple Application Demo") //
                .version("1.0.0"));
    }
}

另外我们对 swagger文档 开启和访问的uri做些配置,见于applicaiton.yaml:

springdoc:
  api-docs:
    # default: /v3/api-docs
    path: /api-docs
  swagger-ui:
    # 访问路径
    path: swagger-ui-custom.html
    # 是否开启 非prod -> true, prod -> false
    enabled: true

接下来我们为后面的文档做些准备工作。

统一的响应结构

枚举类

package com.example.swaggerdemo;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum RespEnums {
    SUCCESS(0, "Success"),
    FAIL(1, "Operation failed.");

    private Integer code;

    private String msg;
}

统一响应体

package com.example.swaggerdemo;

import lombok.Data;

@Data
public class RespInfo<T> {
    private Integer code;

    private String msg;

    private T data;

    /**
     * 全参方法
     * @param code
     * @param msg
     * @param data
     * @param <T>
     * @return
     */
    private static <T> RespInfo<T> response(int code, String msg, T data) {
        RespInfo<T> respInfo = new RespInfo<>();
        respInfo.setCode(code);
        respInfo.setMsg(msg);
        respInfo.setData(data);

        return respInfo;
    }

    /**
     * 缺失data方法
     * @param code
     * @param msg
     * @param <T>
     * @return
     */
    private static <T> RespInfo<T> response(int code, String msg) {
        RespInfo<T> respInfo = new RespInfo<>();
        respInfo.setCode(code);
        respInfo.setMsg(msg);

        return respInfo;
    }

    public static <T> RespInfo<T> success() {
        return response(RespEnums.SUCCESS.getCode(), RespEnums.SUCCESS.getMsg());
    }

    public static <T> RespInfo<T> success(T data) {
        return response(RespEnums.SUCCESS.getCode(), RespEnums.SUCCESS.getMsg(), data);
    }

    public static <T> RespInfo<T> fail() {
        return response(RespEnums.FAIL.getCode(), RespEnums.FAIL.getMsg());
    }

    public static <T> RespInfo<T> fail(int code, String msg) {
        return response(code, msg);
    }

    public static <T> RespInfo<T> fail(int code, String msg, T data) {
        return response(code, msg, data);
    }

}

由于我们以用户信息为示例,这里构建个 user bean:

package com.example.swaggerdemo;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;

@Data
public class User {
    @Min(value = 1000)
    private Integer id;

    @NotBlank(message = "name not null.")
    @Size(min = 3, max = 20, message = "name's length should be 3 ~ 20.")
    private String name;

    @Min(value = 18, message = "should be adult.")
    @Max(value = 100, message = "should in rational range.")
    private Integer age;
}

接下来编写我们的控制器类。

控制器类

登陆控制器类

package com.example.swaggerdemo;

import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Tag(name = "认证管理接口",description = "登陆登出接口")
@RequestMapping("/auth")
public class AuthController {

    @PostMapping("/login")
    public RespInfo login() {
        return RespInfo.success();
    }

    @DeleteMapping("/logout")
    public RespInfo logout() {
        return RespInfo.success();
    }
}

用户管理类

package com.example.swaggerdemo;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;

@RestController
@Tag(name = "用户信息管理接口", description = "用户信息管理的增删改查")
@RequestMapping("/user")
public class UserController {

    @GetMapping("/getInfo/{id}")
    @Operation(method = "GET", summary = "获取用户信息")
    @ApiResponses(value = { // 输出不同的结果响应
            @ApiResponse(responseCode = "200", description = "Found the user", content = {
                    @Content(mediaType = "application/json", schema = @Schema(implementation = RespInfo.class))
            }),
            @ApiResponse(responseCode = "404", description = "User not found", content = @Content)
    })
    public RespInfo<User> getUserInfo(@PathVariable(name = "id", required = true) final int id) {
        User user = new User();
        user.setId(id);
        user.setName("alice");
        return RespInfo.success(user);
    }

    @PostMapping("/adduser")
    @Operation(method = "POST", summary = "添加用户信息")
    public RespInfo addUser(@RequestBody User user) {
        return RespInfo.success();
    }

    @PostMapping("/updateInfo")
    @Operation(method = "POST", summary = "更改用户信息")
    public RespInfo updateInfo(@RequestBody User user) {
        return RespInfo.success();
    }

    @DeleteMapping("/deleteInfo")
    @Operation(method = "DELETE", summary = "删除用户信息")
    public RespInfo deleteInfo(@RequestBody User user) {
        return RespInfo.success();
    }
}

测试结构

这些工作结束后,运行程序,通过 http://localhost:8080/swagger-ui/index.html 就可以访问 API文档了:

image.png

每个接口信息:

image.png

响应体结构:

image.png

参考:

标签:code,Java,Spring,Boot,return,import,swagger,public,RespInfo
From: https://www.cnblogs.com/davis12/p/17911155.html

相关文章

  • 无涯教程-Java - BitSet 类函数
    BitSet类创建一种特殊的数组,其中包含位值,BitSet数组可以根据需要增加大小,这使其类似于位向量,这是一个旧类,但已在Java2版本1.4中进行了重新设计。BitSet定义以下两个构造函数。Sr.No.Constructor&Remark1BitSet()该构造函数创建一个默认对象。2BitSet(intsize)......
  • 2023 年活力开源贡献者、开源项目揭晓|JeecgBoot 成功入选
    JeecgBoot是一个开源的企业级快速开发平台,它成功入选2023年度生态开源项目,这是对其十年坚持开源的实至名归的认可。作为一个开源项目,JeecgBoot在过去的十年里一直秉承着开放、共享、协作的理念,不断推动着开源社区的发展。其成功入选2023年度生态开源项目,无疑是对其在开源领......
  • Java设计模式之七大设计原则
    七大设计原则设计原则概述单一职责原则定义一个类仅有一个引起它变化的原因分析模拟场景访客用户普通用户VIP用户代码实现/***视频用户接口*/publicinterfaceIVideoUserService{​  voiddefinition();​  voidadvertisement();}​/***......
  • Java工具库中字符串判空方法知多少?各有什么区别?
    SpringFramework库在SpringBoot项目中,通常情况下,你不需要额外引入依赖来使用SpringFramework库中的常用工具方法,这是因为SpringBoot的起步依赖已经包含了SpringFramework的核心库,其中包括org.springframework.util包。这个用起来就很方便。在这里面有两个常用的方法:StringUtil......
  • SpringBoot 2项目中,serviceA的方法中调用了serviceB的方法能触发事务吗
    需求描述在一个SpringBoot2.x项目中,有一个需求是在serviceA的method1方法中执行两个数据库操作,并在其中的某一步调用了serviceB的method2,而method2也包含了数据库操作。如果在这个过程中发生了异常,希望能够确保所有的数据库操作都能够回滚,以保持数据的一致性。该如何在代码中实现......
  • SpringBoot异步任务获取HttpServletRequest
     前言在使用框架日常开发中需要在controller中进行一些异步操作减少请求时间,但是发现在使用@Anysc注解后会出现Request对象无法获取的情况,本文就此情况给出完整的解决方案原因分析@Anysc注解会开启一个新的线程,主线程的Request和子线程是不共享的,所以获取为null在使用spr......
  • 无涯教程-Java - Enumeration 枚举接口函数
    Enumeration接口定义了可以枚举对象集合中的元素的方法。下表总结了Enumeration声明的方法-Sr.No.Method&Remark1booleanhasMoreElements()当实现时,必须在提取更多元素时返回true,而在列举所有元素时返回false。2ObjectnextElement()这将返回枚举中的下一个对象......
  • spirng、springboot、jdk、maven、tomcat版本问题
    引入springboot依赖时会自动安装spring对应依赖,版本由springboot决定。springboot2.x.x及以下使用jdk11、jdk8都可以,springboot3.x.x最低要求jdk17maven与jdk版本关系,参照链接:https://maven.apache.org/docs/history.htmlApacheTomcat是JakartaEE(JavaEE)技术子集的开源......
  • Java | 多线程并发编程CountDownLatch实践
    关注:CodingTechWork引言  在一次数据割接需求中,数据需要通过编程的方式进行转移割接到新平台,此时若串行化方式,无疑会拉锯此次战斗,所以首当其冲要使用并发编程来降低割接时长。  本次主要考虑使用CountDownLatch工具类进行并发编程的控制。CountDownLatch概述  在并发编程过程......
  • 无涯教程-Java's Built-in Exceptions函数
    Java在标准包java.lang中定义了几个异常类。这些异常中最通用的是标准类型RuntimeException的子类。由于java.lang被隐式导入所有Java程序中,因此从RuntimeException派生的大多数异常都是自动可用的。Java定义了与其他各种类库相关的几种其他类型的异常。以下是JavaUnchecke......