配置POM

只需要加一个依赖,并且要注意,swagger3在springboot2.5版本以上会出现问题

        <dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>

如果高于2.5版本会报错:

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

解决方法是降低spring的版本到2.5.x以下,或者是降低swagger版本到3以下,或者是在SwaggerConfig注解上标注@EnableWebMvc

配置例子

配置SwaggerConfig

@Configuration
@EnableSwagger2
@Slf4j
@EnableWebMvc
public class SwaggerConfig { @Bean
public Docket docket(Environment environment) {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo()) // 文档基础配置
.select()
.paths(PathSelectors.regex("(?!/error.*).*")) //加这行去除掉basic error controller接口
.build(); } private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("xx平台接口文档")
.build();
} }

配置实体类

@ApiModel(value = "UsersDTO", description = "UsersDTO实体类")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserDTO { @ApiModelProperty(value = "First name", example = "Jean")
private String firstname; @ApiModelProperty(value = "Last name", example = "ab")
private String lastname; @ApiModelProperty(value = "CardInfo")
private CardInfo cardInfo; }

可以看到这个类存在CardInfo嵌套类,对嵌套类的配置同上:

@ApiModel(value = "CardInfo", description = "CardInfo实体类")
@Data
public class CardInfo { @ApiModelProperty(value = "cardName", example = "card")
String cardName;
}

注意:实体类的字段都需要有get方法,不然会失效,这里统一使用lombok的@Data解决

配置Controller类

@RestController
@Api(tags = "用户管理接口")
@RequestMapping("/users")
public class UsersController { @Autowired
private UsersService usersService; @ApiOperation(value = "用户注册",notes = "传入用户信息进行注册")
@PostMapping(value = "/register")
public AjaxResult<Users> register(@RequestBody Users users) throws IOException {
usersService.save(users);
return AjaxResult.success(users);
} }

这里面的返回值AjaxResult需要定义好泛型,在返回值初定义类型

AjaxResult类

@ApiModel("API通用返回数据")
@Data
public class AjaxResult<T> { @ApiModelProperty(value = "状态码", example = "200")
private final int code; @ApiModelProperty(value = "返回消息", example = "success")
private final String message; @ApiModelProperty("数据对象")
private final T data; public AjaxResult(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
} public int getCode() {
return code;
} public String getMessage() {
return message;
} public T getData() {
return data;
} public static <T> AjaxResult<T> success() {
return new AjaxResult<>(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null);
} public static <T> AjaxResult<T> success(String message) {
return new AjaxResult<>(ResultCodeEnum.SUCCESS.getCode(), message, null);
} public static <T> AjaxResult<T> success(T data) {
return new AjaxResult<>(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
} public static <T> AjaxResult<T> success(String message, T data) {
return new AjaxResult<>(ResultCodeEnum.SUCCESS.getCode(), message, data);
} public static <T> AjaxResult<T> failed() {
return new AjaxResult<>(ResultCodeEnum.FAILED.getCode(), ResultCodeEnum.FAILED.getMessage(), null);
} public static <T> AjaxResult<T> failed(String message) {
return new AjaxResult<>(ResultCodeEnum.FAILED.getCode(), message, null);
} public static <T> AjaxResult<T> failed(ResultCodeEnum resultCodeEnum) {
return new AjaxResult<>(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null);
} public static <T> AjaxResult<T> failed(String message, T data) {
return new AjaxResult<>(ResultCodeEnum.FAILED.getCode(), message, data);
} public static <T> AjaxResult<T> failed(ResultCodeEnum resultCodeEnum, T data) {
return new AjaxResult<>(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
}
}

效果

swagger有关的常用注解

  1. @Api 注解

    @Api 注解用于描述整个 API,通常放在控制器类上,一般使用tags注解就可以

    @Api(tags = "User API")
    @RestController
    @RequestMapping("/api/users")
    public class UserController {
    // ...
    }
  2. @ApiOperation 注解

    @ApiOperation 注解用于描述具体的 API 操作,通常放在控制器方法上

    @ApiOperation(
    value = "Get user by ID",
    notes = "Get user details by providing user ID"
    )
    @GetMapping("/{userId}")
    public ResponseEntity<User> getUserById(@PathVariable Long userId) {
    // Implementation to get user by ID
    }
  3. @ApiParam 注解

    @ApiParam 注解用于描述方法参数,提供参数的名称、描述等信息。

    @GetMapping("/{userId}")
    public ResponseEntity<User> getUserById(
    @ApiParam(name = "userId", value = "ID of the user", required = true)
    @PathVariable Long userId) {
    // Implementation to get user by ID
    }
  4. @ApiResponse@ApiResponses 注解

    这两个注解用于描述操作的响应信息,作用在方法上。

    @ApiResponses({
    @ApiResponse(code = 200, message = "Successful operation", response = String.class),
    @ApiResponse(code = 404, message = "User not found", response = String.class),
    })
    @GetMapping("/{userId}")
    public ResponseEntity<User> getUserById(@PathVariable Long userId) {
    // Implementation to get user by ID
    }
  5. @ApiModel@ApiModelProperty 注解

    这两个注解用于描述数据模型,通常放在实体类上。其中,下述的example可以实现在swagger页面调接口的默认值,并且如果导入到如eolink这种api管理工具,这个默认值也会填充进去。

    @ApiModel(description = "User information")
    public class User {
    @ApiModelProperty(value = "User ID", example = "ab")
    private Long id; @ApiModelProperty(value = "User name", example = "cd")
    private String name; // Getters and setters
    }
  6. @ApiIgnore 注解

    @ApiIgnore 注解用于标记不想在 Swagger 文档中显示的类、方法。

    @ApiIgnore
    public class IgnoredController {
    // ...
    }

    上述的 IgnoredController 类及其所有方法将被忽略。

  7. @ApiParamImplicit 注解

    @ApiParamImplicit 注解用于表示参数,需要被包含在注解@ApiImplicitParams之内。

    @ApiImplicitParams({
    @ApiImplicitParam(name = "userId", value = "ID of the user", required = true, dataType = "long", paramType = "path"),
    })
    @GetMapping("/{userId}")
    public ResponseEntity<User> getUserById(
    @PathVariable Long userId) {
    // Implementation to get user by ID
    }

导出json格式的swagger文档

点击主页这个地方

按F12,在源代码里面的v2-api-docs里面右键另存为

输入名称和后缀进行保存

导入eolink

点api向下的箭头,再选swagger

导入成功后可以看到,传参和返回值都能被正确识别和导入,包括传参的默认值也有

手把手带你上手swagger3的更多相关文章

  1. [.Net] 手把手带你将自己打造的类库丢到 NuGet 上

    手把手带你将自己打造的类库丢到 NuGet 上 序 我们习惯了对项目右键点击“引用”,选择“管理NuGet 程序包”来下载第三方的类库,可曾想过有一天将自己的打造的类库放到 NuGet 上,让第三者下 ...

  2. 手把手带你做一个超炫酷loading成功动画view Android自定义view

    写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...

  3. Android性能优化:手把手带你全面实现内存优化

      前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的内存优化,希望你们会喜欢 目录   1. 定义 优化处理 应用程序的内存使用.空间占用 2. 作用 避免因不正确使用内 ...

  4. Android:手把手带你深入剖析 Retrofit 2.0 源码

    前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...

  5. [转帖]从零开始入门 K8s | 手把手带你理解 etcd

    从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...

  6. 手把手带你阅读Mybatis源码(三)缓存篇

    前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读Mybatis源码(一)构造篇 和 手把手带你阅读Mybatis源码(二)执行篇,主要说明了MyBatis是如何 ...

  7. GitHub 热点速览 Vol.26:手把手带你做数据库

    作者:HelloGitHub-小鱼干 摘要:手把手带你学知识,应该是学习新知识最友好的姿势了.toyDB 虽然作为一个"玩具"项目不能应用在实际开发中,但通过它你可以了解到如何制作 ...

  8. 手把手带你体验鸿蒙 harmonyOS

    wNlRGd.png 前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 image.png 一.为什么要尝鲜 harmonyos? wNlfx ...

  9. Java开发不懂Docker,学尽Java也枉然,阿里P8架构师手把手带你玩转Docker实战

    转: Java开发不懂Docker,学尽Java也枉然,阿里P8架构师手把手带你玩转Docker实战 Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一 ...

  10. 手把手带你使用EFR32 -- 土壤湿度传感器变身第二形态,以 ZigBee 形态出击

    前言 后悔,总之就是非常后悔,我当时到底是为啥才会猪油蒙心,选择了 EFR32 来学习 ZigBee 使用啊? EFR32 这玩意看性能确实不错,但是资料太少了,EmberZnet SDK 也是用得一 ...

随机推荐

  1. WebGPU光追引擎基础课:使用WebGPU绘制三角形

    大家好~我开设了"WebGPU光追引擎基础课"的线上课程,从0开始,在课上带领大家现场写代码,使用WebGPU开发基础的光线追踪引擎 课程重点在于基于GPU并行计算,实现BVH构建 ...

  2. iview 表单有值却校验失败

    转载请注明出处: iview 表单校验数值的时候,表单有值,却在提交的时候,提示表单校验失败: 解决方案: 1. IviewUI的文档里查到了rules规则里面有个校验类型的属性字段type rule ...

  3. 使用Swagger,在编写配置类时报错Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null

    1.问题 Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet. ...

  4. Vue事件方法中this.属性名

    vue事件方法中访问data对象中的成员 : this.属性名 注意: 如果事件处理代码没有写到methods中,而是写在行内则不需要this.

  5. 为什么 sort() 中的 return a-b 可以决定升序

    arr.sort( function(a,b){ return a-b; } ) 千万不要理解成 a 减 b 其实它代表的是26个字母中的 a 和 b b 比 a 大,所以 a - b 就是升序,写成 ...

  6. Pickle反序列化学习

    什么是Pickle? 很简单,就是一个python的序列化模块,方便对象的传输与存储.但是pickle的灵活度很高,可以通过对opcode的编写来实现代码执行的效果,由此引发一系列的安全问题 Pick ...

  7. [转帖]Linux的缓存内存(cache memory)

    PS:为什么Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做Cache Memory. 为什么Linux系统没运行多少程 ...

  8. [转帖]Nginx动静分离;资源分离;rewrite重写、跳转、伪静态、规则、日志

    https://www.cnblogs.com/caodan01/p/14745562.html 一.动静分离 动静分离,通过中间件将动静请求和静态请求进行分离: 通过中间件将动态请求和静态请求分离, ...

  9. 【转贴】linux命令总结之seq命令

    linux命令总结之seq命令 https://www.cnblogs.com/ginvip/p/6351720.html 功能: seq命令用于产生从某个数到另外一个数之间的所有整数. 语法: 1 ...

  10. ChaosMesh 半离线安装过程

    说明 所谓半离线值得是公司拉不下镜像来 !-_-! 都是学习的官网资料https://chaos-mesh.org/docs 镜像获取 其实镜像获取很容易. 找一个能上外网的VPC就可以了. mkdi ...