Swagger+YApi

Swagger

介绍

在工作时,编写玩代码以后,我们还要写一个接口文档,提供给前端或者需要调用这个接口的人看,但是手写文档实在是太费事了,所以就出现了Swgger框架,可以实现调用restFul风格的web服务,自动生成接口文档,还可以在线测试接口 

使用步骤

原生的Swager被国人集成到了Spring Boot红中了,所以只需导入启动Swagger依赖

第一步:

 <!-- swagger对springboot的集成 -->
<dependency>
  <groupId>com.spring4all</groupId>
  <artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.0.RELEASE</version>

第二步:
  在配置文件中配置wagger

server:
  port: 8080    #应用的端口号
  servlet:
    context-path: /swagger  #设置根路径为  swagger

#   Spring Boot   集成swagger配置
swagger:
  enabled: true  # 开启swagger
  base-package: com.itcast.swagger.controller   # 需要生成接口文档的类所在的包
  title: "测试工程"   # 文档标题
  description: "测试swagger  这是描述"    # 文档描述
  version: 1.0   # 文档的版本号

然后启动就行,这里也看到了有一个

base-package: com.itcast.swagger.controller   # 需要生成接口文档的类所在的包

swagger就会去这个包中把里面的类生成文档。

运行结果:

注意事项 

@Controller:  swagger只会对标有@Controller注解或者他的派生类生成文档,也就是即使base-package扫描到了但是没有@Controller注解或者他的派生类依然生成不了文档


@RequestMapping:     swagger只会对有@RequestMapping生成文档

@RequestParam:这个注解接收的是例如  localhost:8080/stu?num=3      在swagger中这个名称是  问号传参     可视化界面为:query

@PathVariable: 这儿参数接受的是RestFul风格的请求,在swagger中叫 path请求   例如       localhost:8080/3     可视化界面为:path

@RequestBody:是接收的请求体中的请求  也叫 请求体传参    可视化界面为:body

 swagger注解开发

在我们上边的代码中,只能看到传参信息,但是并没有表示请求,但是我们可以通过swagger文档注解来说明文档的具体信息

常用注解:

@Api()用于类;
描述这个类是swagger的资源
@ApiOperation()用于方法;
描述一个http请求的操作
@ApiParam()用于方法,参数,字段说明;
描述参数的添加元数据(说明或是否必填等)
@ApiModel()用于类
表示对类进行说明,用于参数用实体类接收
@ApiModelProperty()用于方法,字段
表示对model属性的说明或者数据操作更改
@ApiIgnore()用于类,方法,方法参数
表示这个方法或者类被忽略
@ApiImplicitParam() 用于方法
表示单独的请求参数
@ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam

代码示例

 如果把注解都弄到controller会有点不太舒服看着,因为既要加SpringMVC的注解又要加Swagger的,所以这时候就可以创建一个接口让Controller实现这个接口,然后在接口中把这些方法都添加swagger的注解说明,这样就完成了SpringMVC和swagger都区分开了

接口的代码

@Api(tags = "Hello Api 服务测试", description = "对Hello Api 服务提供接口")
public interface HelloApi {

    @ApiOperation("测试Hello方法")
    String hello();

    @ApiOperation("测试modifyStudentNum方法")
    @ApiImplicitParam(name = "numtest参数", value = "numtest参数解释", required = true, dataType = "string", paramType = "问号请求也叫query请求")
        //上边的required = true表示是否必须传的参数,true为必须
    Student modifyStudentNum(String numtest);

    @ApiOperation("测试mmodifyStudentName方法")
    @ApiImplicitParam(name = "name参数", value = "name参数解释", required = true, dataType = "string", paramType = "路径请求也叫path请求")
    Student modifyStudentName(String name);

    @ApiOperation("测试modifyStudent方法")
        //因为它传的是实体类所以要在实体类中添加注解
    Student modifyStudent(Student student);

    @ApiOperation("测试mofidyStudentBynNum综合方法")
    //因为这里参数很多所以需要使用@ApiImplicitParams({})  如果单个参数就是用@ApiImplicitParam()
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id参数", value = "id参数解释", required = true, dataType = "string", paramType = "路径请求也叫path请求"),
            @ApiImplicitParam(name = "name参数", value = "name参数解释", required = true, dataType = "string", paramType = "问号请求也叫query请求")
    })
    //因为它传的是实体类所以要在实体类中添加注解
    Student mofidyStudentBynNum(String id, String name, Student student);
}

 controller的代码

@RestController
@RequestMapping("stu")
public class HelloController implements HelloApi {
    /**
     * 测试无参数接口地址
       无参:get  http://ip:port/rootPath/stu/hello
     */
    @Override
    @GetMapping("hello")
    public String hello() {
        return "hello";
    }
    /**
     * 测试 queryString 风格的参入参数
       QueryString(问号传参):
       get	http://ip:port/rootPath/stu?num=xxx
     */
    @Override
    @GetMapping
    public Student modifyStudentNum(@RequestParam("num") String numtest) {
        Student student = new Student(numtest, "xiaohong", 10, "parts");
        return student;
    }
    /**
     * 测试Restful风格的参入参数
       path(Restful):
       get	http://ip:port/rootPath/stu/xxxx
     */
    @Override
    @GetMapping("{name}")
    public Student modifyStudentName(@PathVariable("name") String name) {
        Student student = new Student("002", name, 10, "parts");
        return student;
    }
    /**
     * 测试json格式的传入参数
       请求体传参(json格式的数据):
       	post http://ip:port/rootPath/stu
       	requestBody:
        {
        	"xxxxx":"xxxx"
        }
     */
    @Override
    @PostMapping
    public Student modifyStudent(@RequestBody Student student) {
        student.setName("modifyName");
        return student;
    }
    /**
     * 测试 queryString 、Restful 和 json 格式的参数
       put	http://ip:port/rootPath/stu/xxxx?name=xxx
       	requestBody:
        {
        	"xxxxx":"xxxx"
        }
     */
    @Override
    @PutMapping("{id}")
    public Student mofidyStudentBynNum(@PathVariable("id") String id, @RequestParam("name") String name, @RequestBody Student student) {
        student.setName(name);
        student.setStuNo(id);
        return student;
    }
}

 实体类

@Data
@AllArgsConstructor
@ApiModel(value = "学员实体类  value",description = "对学员实体类进行描述  description")
public class Student {
    //学员编号
    @ApiModelProperty("学院编号")
    private String stuNo;
    //学成名称
    @ApiModelProperty("学院名称")
    private String name;
    //学员年龄
    @ApiModelProperty("学院年龄")
    private int age;
    //学员地址
    @ApiModelProperty("学院地址")
    private String address;

    //getter/setter 省略
}

 结果

 

Linux安装YApi 

 但是这个swapper需要代码运行起来才能使用,所以我们需要使用一个Yapi可以理解为将swapper中的接口文档持久化,当swapper打开以后将swapper的接口文档信息导入到YApi,这样即使swapper关闭了我们也是可以看到这个接口文档的通过YApi

 使用步骤:

拉取镜像:

docker pull registry.cn-hangzhou.aliyuncs.com/anoyi/yapi

 创建YApi的工作目录

 #创建目录
mkdir -p /usr/soft/yapi/config

 #进入到目录中 

cd /usr/soft/yapi/config

 YApi的配置文件config.json

{
  "port": "3000",
  "adminAccount": "admin@anoyi.com",
  "timeout":120000,
  "db": {
    "servername": "mongo",
    "DATABASE": "yapi",
    "port": 27017,
    "user": "admin",
    "pass": "anoyi",
    "authSource": "admin"
  }
}

在 上边创建的 /usr/soft/yapi/config 中执行下面命令来初始化yapi的数据库索引及管理员账号

docker run -it --rm \
  --link mongo-yapi:mongo \
  --entrypoint npm \
  --workdir /yapi/vendors \
  -v $PWD/config.json:/yapi/config.json \
  registry.cn-hangzhou.aliyuncs.com/anoyi/yapi \
  run install-server 

初始化后yapi默认的账号为: admin@anoyi.com    密码: ymfe.org

在 /usr/soft/yapi/config中执行下面命令来创建容器

docker run -d \
  --name yapi \
  --link mongo-yapi:mongo \
  --workdir /yapi/vendors \
  -p 3000:3000 \
  -v $PWD/config.json:/yapi/config.json \
  registry.cn-hangzhou.aliyuncs.com/anoyi/yapi \
  server/app.js

然后就可以访问游览器了,地址为   http://ip地址:3000 

游览器结果如下:
 

然后创建一个组再给组里创建一个项目,因为只有创建以后页面会变成下边这样


 

再进去swagger可视化界面进入下边这个地方

 

 出现这个,都是 接口的数据,复制粘贴,然后新建一个文件夹,后缀为json 

 下一步:

结果:
 

 

<think>首先,用户的问题是关于解决Swagger导入YAPI时类名注释未生效的问题。用户提供了三个引用,但我需要参考用户上一次的问题和我的回答,但在这个会话中没有之前的交互,所以我会专注于当前的查询。 用户的关键问题是:"解决swagger导入yapi时类名注释未生效问题的方法"。意思是,当使用Swagger导入到YAPI时,类名注释没有生效。 从引用中: - 引用[1]:讨论了Swagger中如何使用@ApiResponses和@ApiResponse来处理非实体类的响应,但不能添加字段注释。 - 引用[2]:提到了使用Knife4j来简化Swagger文档的编写。 - 引用[3]:是一个安全相关的示例,可能无关紧要。 系统级指令: 1. 所有行内数学表达式必须使用$...$格式。但在这个上下文中,可能没有数学内容,所以我不需要添加。 2. 独立公式使用$$...$$并单独成段。同样,可能不适用。 3. LaTeX语法正确:确保如果使用数学,语法正确。 4. 使用中文回答:是的。 5. 生成相关问题:在回答末尾添加相关问题。 6. 引用的段落末尾自然地添加引用标识,例如:[^1]。 回答结构: - 结构清晰,逐步解决问题。 - 尽量保证真实可靠。 用户的问题是关于Swagger导入YAPI时的类名注释问题。YAPI是一个API管理工具,Swagger用于生成API文档。 常见原因Swagger注释不生效: 1. **注解使用不正确**:在Java中,使用Swagger注解如@ApiModel、@ApiModelProperty等可能没有被正确应用。 2. **配置问题**:Swagger配置可能没有启用或扫描包不正确。 3. **YAPI导入问题**:YAPI可能不支持某些Swagger特性,或者在导入过程中注释丢失。 4. **实体类定义**:引用[1]提到Swagger推荐使用实体类来添加详细注释。非实体类可能无法添加字段注释。 解决方案: - 确保在实体类中使用正确的Swagger注解。 - 检查Swagger的Docket配置,确保扫描了正确的包。 - 对于YAPI,确保导入的Swagger文件包含注释信息。 - 使用工具如Knife4j(引用[2]提到)来增强Swagger生成。 具体步骤: 1. **检查Swagger注解**:在Java类中,使用@ApiModel(description = "类描述")在类级别,@ApiModelProperty(value = "字段描述")在字段级别。 2. **验证Swagger UI**:首先在本地运行应用,访问Swagger UI(如http://localhost:8080/swagger-ui.html),查看注释是否显示正常。如果不显示,问题在Swagger配置。 3. **生成Swagger JSON**:确保生成的Swagger JSON文件(通常是/v2/api-docs)包含注释信息。 4. **YAPI导入**:当导入Swagger JSON到YAPI时,YAPI应该能解析注释。如果注释不显示,可能是YAPI的限制或导入格式问题。 5. **使用Knife4j**:Knife4j提供更好的Swagger集成,可能帮助生成更完整的文档,然后导入YAPI。 根据引用[1],Swagger对非实体类响应无法详细说明字段,所以推荐使用实体类。对于类名注释,可能是类似的问题。 回答结构: - 介绍问题原因。 - 提供逐步解决方法。 - 引用相关部分。 最后,添加相关问题。 相关问题示例: 1. 如何正确配置Swagger来确保注释生效? 2. YAPI导入Swagger时的常见问题解决方法? 3. 使用Knife4j优化Swagger文档生成的步骤? 确保引用添加:在回答中,如果提到引用内容,在末尾加[^1]等。 比如,提到非实体类问题时,添加[^1]。 现在,构建回答。 </think>### 解决Swagger导入YAPI时类名注释未生效问题的方法 在使用Swagger生成API文档并导入到YAPI平台时,类名注释(如`@ApiModel`或`@ApiOperation`中的描述)可能无法正确显示。这通常是由于Swagger注解配置不当、YAPI导入机制限制或工具集成问题导致。以下是基于常见实践和引用内容的逐步解决方法,确保真实可靠。首先,建议验证Swagger本地生成的文档是否正常,再处理YAPI导入问题。 #### 步骤1: 检查并修正Swagger注解配置 Swagger的类名注释依赖正确的注解使用。如果注解未生效,先确保在代码中正确应用Swagger标准注解: - **在实体类上添加`@ApiModel`注解**:Swagger推荐使用实体类来承载详细注释(如引用[1]所述,非实体类响应无法添加字段注释)。在类级别使用`@ApiModel(description = "类描述")`提供注释。 ```java @ApiModel(description = "这是一个用户实体类,用于存储用户信息") public class User { @ApiModelProperty(value = "用户ID", example = "1") private Long id; // 其他字段... } ``` - **在Controller方法上使用`@ApiOperation`**:确保类名或方法描述通过`@ApiOperation(notes = "详细描述")`指定。 ```java @ApiOperation(value = "获取用户列表", notes = "返回所有用户信息的列表") @GetMapping("/users") public List<User> getUsers() { // 方法实现 } ``` - **验证Swagger UI本地显示**:运行应用后访问Swagger UI(例如http://localhost:8080/swagger-ui.html),检查注释是否可见。如果不显示,问题可能出在Swagger配置或包扫描上: - 检查`Docket` Bean配置,确保启用了注解扫描: ```java @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.example.controller")) // 指定扫描包路径 .paths(PathSelectors.any()) .build(); } ``` - 如果注释仍未生效,可能是依赖冲突;清理并重新构建项目(如使用Maven: `mvn clean install`)。 引用[1]强调Swagger对非实体类的限制:直接返回字符串或Map等非结构化响应时,注释无法添加字段详情,优先使用实体类规避问题[^1]。 #### 步骤2: 生成并验证Swagger JSON文件 YAPI导入基于Swagger生成的JSON文件(通常来自`/v2/api-docs`端点)。确保该文件包含注释信息: - **访问Swagger JSON端点**:在浏览器中打开`http://localhost:8080/v2/api-docs`(端口根据实际调整),检查JSON中是否有`description`或`notes`字段(例如在`definitions`或`paths`部分)。 - **修复JSON缺失注释问题**:如果JSON文件中类名注释缺失,通常是注解未正确序列化: - 添加Swagger核心依赖(如Springfox): ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>3.0.0</version> <!-- 根据项目选择版本 --> </dependency> ``` - 使用工具如Knife4j(引用[2]提及)增强文档生成:Knife4j简化了Swagger集成并提供更友好的UI,有助于生成完整JSON。在`pom.xml`中添加依赖: ```xml <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.2</version> </dependency> ``` 访问Knife4j UI(http://localhost:8080/doc.html)确认注释正常后,导出JSON文件[^2]。 #### 步骤3: 优化YAPI导入过程 YAPI在导入Swagger JSON时可能忽略注释,需检查导入设置和兼容性: - **使用YAPISwagger导入功能**: 1. 在YAPI项目中,选择“导入” > “Swagger URL或JSON文件”。 2. 上传步骤2生成的JSON文件,确保勾选“保留注释”选项(如果YAPI版本支持)。 - **处理导入兼容性问题**: - **YAPI版本升级**:旧版YAPI可能不支持Swagger所有特性;升级到最新版(如YAPI v1.10+)以改善兼容性。 - **手动补充注释**:如果导入后仍缺失,在YAPI中手动编辑接口描述(临时方案);或在Swagger JSON中直接添加`description`字段后重新导入。 - **验证导入结果**:在YAPI查看导入的API,检查类名注释是否显示。如果问题持续,检查YAPI日志或社区论坛(如GitHub Issues)寻求特定版本修复。 #### 常见问题排查 - **注解未生效原因**:确保类和方法未被`@Ignore`注解忽略;检查IDE是否启用annotation processing。 - **安全考虑**:引用[3]示例提醒,API文档可能暴露敏感信息;导入前审查JSON文件,移除不必要细节[^3]。 - **工具替代方案**:如果问题顽固,考虑使用Apifox或Postman等工具导入Swagger,再同步到YAPI。 通过以上步骤,大多数类名注释不生效问题可解决。实践中,优先使用实体类和Knife4j增强工具能显著提升成功率[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值