Coder Social home page Coder Social logo

forgus / api-generator Goto Github PK

View Code? Open in Web Editor NEW
228.0 10.0 61.0 2.88 MB

Api Generator是一款可以自动解析Controller类抽取REST接口信息并自动上传YApi的IDEA插件。YApi好伴侣,从此维护文档再也不是事儿了!

License: GNU General Public License v2.0

Java 100.00%
yapi idea-plugin api-documentation tools dubbo restful-api rest rest-api markdown-yapi preferences

api-generator's Introduction

Api Generator

简介

《Api Generator》是一款可以自动生成接口文档的IDEA插件。包括基于Spring注解的RESTful接口和用于定义dubbo api的普通接口。其中,RESTful接口将自动上传并托管在内网部署的YApi服务器上,而普通接口则以markdown文件的形式保存在指定目录。 所以,如果你想利用该插件的能力帮你生成REST接口文档,请先确保你已部署好自己的YApi服务端。
传送门:如何部署YApi平台

特性

  • 基于javadoc解析,无代码入侵
  • 支持字段过滤,自动忽略过滤字段的解析
  • 自动识别类,生成markdown文档或上传到YApi
  • 支持List、Set、Collection等数据结构,支持嵌套泛型解析
  • 支持@NotNull、@ResponseBody等常用注解的解析,基于json5生成YApi文档

快速开始

安装插件

Preferences → Plugins → Marketplace → 搜索“Api Generator” → 安装该插件 → 重启IDE

开始使用

上传REST接口

选择一个Controller类,将光标定位到方法区(方法名或者方法注释)或Controller类上,点击鼠标右键,在弹出的菜单项里选择“Generate Api”单击,文档瞬间已经自动生成并托管到YApi平台!
(PS:首次使用会弹框提示输入YApi部署的url和项目token,填写一次自动保存)

生成dubbo接口文档

操作方式同上,插件会自动识别出这是一个普通接口,插件会将文档以markdown的形式输出,默认保存在当前项目的target目录下。(保存路径可更改,见下文介绍)

插件设置

自定义配置项: Preferences —> Other Settings —> Api Generator Setting

配置项 含义 详细解释
Exclude Fields 过滤字段(多个字段以","分隔) 该配置项功能类似JSONField,用于过滤不想被解析的字段,多用于排除二方包里的干扰字段
Save Directory markdown文档保存目录(绝对路径) 用于配置生成的markdown形式的接口文档的保存路径,默认保存在当前项目的target目录
Indent Style 二级字段缩进前缀 生成的markdown文档是类似于json schema的字段表格,涉及类型是对象的字段,展示上做缩进处理,默认缩进前缀是“└”
Overwrite exists docs 是否覆盖同名markdown文档 如果生成的markdown文件已存在,会弹框提示是否覆盖,勾选该选项,则直接覆盖不提示
Extract filename from doc comments 是否从javadoc抽取文件名 生成的markdown文件默认是方法名,勾选该选项,将从注释里抽取文件名
YApi server url YApi部署服务器地址 内网部署的yapi平台的域名,如:http://yapi.xxx.com
Project token 项目token 接口对应的yapi项目的token
Default save category 默认保存分类 插件生成的yapi文档保存位置,默认api_generator
Classify API automatically 是否自动分类 勾选该选项后,生成文档时插件将从controller类注释里抽取模块名,并在yapi上自动创建对应分类保存接口

详细文档

更多详细介绍请移步wiki
PS:如果觉得好用,请帮我点个赞~

api-generator's People

Contributors

buyili avatar forgus avatar superleeyom avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

api-generator's Issues

响应格式

响应格式能否支持Yapi文档的格式 ,目前已经有响应数据能否将其转化一个文档格式,一个实例数据格式

当在如下场景下,上传会报错

当在如下场景下,上传会报错

1.当绑定了多个路径时

@RequestMapping(value = {"/api/restful/dd/sendDdNotify", "/api/restful/dd/sendNotify"}, method = RequestMethod.POST)

2.使用了Map参数时

public ResponseData recallDdMessage(@RequestBody Map<String, Object> params)

报错信息为
Upload api failed, cause:请求参数 data.path 不应少于 1 个字符

统一格式参数解析

接口返回的参数通过ResponseBodyAdvice封装成统一格式的响应参数:
如:
接口返回Student对象(含有id,name 和age属性):
/**

  • 根据ID获取学生信息
  • @param id 学生ID
  • @return
    */
    @GetMapping
    public Student getStudentById(Integer id){
    return new Student();
    }

接口看似返回json:
{
“id”:1,
"name":"张三",
"age":18
}

但是在ResponseBodyAdvice实现类中,被封装成了:
{
"errorCode":“00000”,
"message":"",
"result":{
“id”:1,
"name":"张三",
"age":18
}
}

是否可以支持这种封装

插件支持 IDEA 社区版么

您好,我现在的项目是springboot项目,IDEA是社区版,执行生成操作的时候,报 Invalid Class File!。
这个是因为 IDEA社区版的问题么?

上传空指针报错

java.lang.NullPointerException
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadSelectedMethodToYApi(ApiGenerateAction.java:218)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadApiToYApi(ApiGenerateAction.java:77)
at site.forgus.plugins.apigenerator.ApiGenerateAction.actionPerformed(ApiGenerateAction.java:67)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:280)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:296)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:281)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:285)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:112)
at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:112)
at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:517)
at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:36)
at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:539)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6651)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
at java.desktop/java.awt.Component.processEvent(Component.java:6416)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:912)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:844)
at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:741)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

请考虑加点日志

同步到yapi的过程,考虑加点日志吧
同步报错后,最好能给出具体原因。

上传出现空指针错误

java.lang.NullPointerException
at site.forgus.plugins.apigenerator.ApiGenerateAction.extractMethodFromAttribute(ApiGenerateAction.java:548)
at site.forgus.plugins.apigenerator.ApiGenerateAction.getMethodFromAnnotation(ApiGenerateAction.java:523)
at site.forgus.plugins.apigenerator.ApiGenerateAction.buildYApiInterface(ApiGenerateAction.java:264)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadToYApi(ApiGenerateAction.java:229)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadSelectedMethodToYApi(ApiGenerateAction.java:225)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadApiToYApi(ApiGenerateAction.java:77)
at site.forgus.plugins.apigenerator.ApiGenerateAction.actionPerformed(ApiGenerateAction.java:67)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:280)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:296)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:281)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:285)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:112)
at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:112)
at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:517)
at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:36)
at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:539)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6651)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
at java.desktop/java.awt.Component.processEvent(Component.java:6416)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:912)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:844)
at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:741)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

pojo类中的List<E>字段,json格式应该是对象却输出数组

类HelloController

@RestController
@RequestMapping("/hello")
public class HelloController {

    /**
     * world
     * @return
     */
    @GetMapping("/world")
    public ResultVo<AppVersion> world(){
        AppVersion appVersion = new AppVersion();
        return ResultVoBuilder.success(appVersion);
    }

}

类ResultVo

@Data
public class ResultVo<E> {

    private int code;

    private String message;

    private E data;

    private List<E> list;

    private List<String> list2;


}

类AppVersion

@Data
public class AppVersion {

	/**
	 * 类型 1=android  2=ios
	 */
	private Integer appType;

	/**
	 * app类型  1=用户端 =2代理端
	 */
	private Integer bizType;


}

生成结果如下;字段list应该为数组,但生成的json为对象

{
  "code": 1,
  "message": "@string",
  "data": {
    "appType": 0,//	  类型 1=android  2=ios 	
    "bizType": 0//	  app类型  1=用户端 =2代理端 	
  },
  "list": {
    "appType": 0,//	  类型 1=android  2=ios 	
    "bizType": 0//	  app类型  1=用户端 =2代理端 	
  },
  "list2": [
    "@string"
  ]
}

idea 2020.1.2 上传接口报错

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
at com.google.gson.Gson.fromJson(Gson.java:932)
at com.google.gson.Gson.fromJson(Gson.java:897)
at com.google.gson.Gson.fromJson(Gson.java:846)
at site.forgus.plugins.apigenerator.yapi.sdk.YApiSdk.getProjectInfo(YApiSdk.java:46)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadSelectedMethodToYApi(ApiGenerateAction.java:217)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadApiToYApi(ApiGenerateAction.java:77)
at site.forgus.plugins.apigenerator.ApiGenerateAction.actionPerformed(ApiGenerateAction.java:67)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:280)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:296)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:281)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:285)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:112)
at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:112)
at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:517)
at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:36)
at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:539)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6650)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
at java.desktop/java.awt.Component.processEvent(Component.java:6415)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5025)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4857)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4857)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:912)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:844)
at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:741)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:386)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
... 57 more

上传接口报错:java.lang.NullPointerException

java.lang.NullPointerException
at site.forgus.plugins.apigenerator.ApiGenerateAction.getCatId(ApiGenerateAction.java:422)
at site.forgus.plugins.apigenerator.ApiGenerateAction.buildYApiInterface(ApiGenerateAction.java:278)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadToYApi(ApiGenerateAction.java:229)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadSelectedMethodToYApi(ApiGenerateAction.java:225)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadApiToYApi(ApiGenerateAction.java:77)
at site.forgus.plugins.apigenerator.ApiGenerateAction.actionPerformed(ApiGenerateAction.java:67)
at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:260)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:277)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:292)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:283)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:107)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:282)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:111)
at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:88)
at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:111)
at com.intellij.openapi.application.TransactionGuardImpl.submitTransaction(TransactionGuardImpl.java:120)
at com.intellij.openapi.application.TransactionGuard.submitTransaction(TransactionGuard.java:121)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:111)
at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:524)
at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:35)
at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:546)
at java.awt.Component.processMouseEvent(Component.java:6550)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3325)
at java.awt.Component.processEvent(Component.java:6315)
at java.awt.Container.processEvent(Container.java:2239)
at java.awt.Component.dispatchEventImpl(Component.java:4899)
at java.awt.Container.dispatchEventImpl(Container.java:2297)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
at java.awt.Container.dispatchEventImpl(Container.java:2283)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:766)
at java.awt.EventQueue.access$500(EventQueue.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:715)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
at java.awt.EventQueue$4.run(EventQueue.java:739)
at java.awt.EventQueue$4.run(EventQueue.java:737)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:736)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:747)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:692)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:391)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

建议作者对收集错误日志部分作出明显标注

读取代码的时候发现作者会收集错误日志,错误日志中会包含部分源代码片段的信息,建议作者对该部分收集的内容和用户在文档中作显著标注或者说明,避免对隐私敏感的使用者产生误解。同时建议增加开关,避免涉密代码的上传。🙏

如果属性为 LocalDateTime、BigInteger 等复杂类型,插件无法支持

作者你好,目前我在配合YApi使用此插件的时候,发现,如果实体类属性中有 jdk自带LocalDateTimeBigInteger 类型属性的时候,插件生成的YAPI json5 数据会出现错误,主要的错误,属性注释会出现错位或不显示,同时铺开该复杂类型内部的其他属性,这里我给个示例,比如此接口:

    /**
     * 测试接口
     *
     * @return test
     */
    @GetMapping("test")
    public ApiResponse<ReserveOrderTestDTO> test() {
        return ApiResponse.ofSuccess(new ReserveOrderTestDTO());
    }

返回实体类:

/**
 * 测试实体类
 *
 * @author leeyom wang
 * @date 2020/9/14 5:05 下午
 */
@Data
public class ReserveOrderTestDTO extends Model<ReserveOrderTestDTO> implements Serializable {

    /**
     * 预约单id
     */
    private Integer orderId;

    /**
     * 预约人微信openid
     */
    private String reserveOpenId;

    /**
     * 预约设备
     */
    private Integer deviceId;

    /**
     * 预约时间
     */
    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    private LocalDateTime reserveTime;

    /**
     * 预约联系电话
     */
    private String applyContactPhone;

    /**
     * 预约人姓名
     */
    private String applyUserName;

    /**
     * 预约地址
     */
    private String applyAddress;

    /**
     * 办公室
     */
    private Integer departmentId;

    /**
     * 状态,1已完成,0未处理
     */
    private Integer status;

    /**
     * 备注
     */
    private String remark;

    /**
     * 版本号
     */
    private Integer version;
}

由于实体类中带了private LocalDateTime reserveTime;属性,最终在 YAPI平台生产的接口json5数据格式为:

{
  "code": 0,//状态码
  "message": "@string",//返回内容
  "data": {//返回数据
    "orderId": 0,//预约单id
    "reserveOpenId": "@string",//预约人微信openid
    "deviceId": 0,//预约设备
    "reserveTime": {//预约时间
      "MIN": {},
      "MAX": {},
      "date": {
        "MIN": {},
        "MAX": {},
        "DAYS_PER_CYCLE": 1,
        "DAYS_0000_TO_1970": 1,
        "year": 1,
        "month": 1,
        "day": 1
      },
      "time": {
        "MIN": {},
        "MAX": {},
        "MIDNIGHT": {},
        "NOON": {},
        "HOURS_PER_DAY": 1,
        "MINUTES_PER_HOUR": 1,
        "MINUTES_PER_DAY": 1,
        "SECONDS_PER_MINUTE": 1,
        "SECONDS_PER_HOUR": 1,
        "SECONDS_PER_DAY": 1,
        "MILLIS_PER_DAY": 1,
        "MICROS_PER_DAY": 1,
        "NANOS_PER_SECOND": 1,
        "NANOS_PER_MINUTE": 1,
        "NANOS_PER_HOUR": 1,
        "NANOS_PER_DAY": 1,
        "hour": 1,
        "minute": 1,
        "second": 1,
        "nano": 1
      }
    },
    "applyContactPhone": "@string",
    "applyUserName": "@string",//预约联系电话
    "applyAddress": "@string",//预约人姓名
    "departmentId": 0,//预约地址
    "status": 0,//办公室
    "remark": "@string",//状态,1已完成,0未处理
    "version": 0//备注
  }
}

image

属性注释发生了错位,能不能对这些复杂类型,进行处理(比如 LocalDateTime类型的,根据是否有 @JsonFormat 注解判断,BigInteger 就直接显示 @long类型 ),不铺开内部的属性,生成正常的数据格式:

{
  "code": 0,//状态码
  "message": "@string",//返回内容
  "data": {//返回数据
    "orderId": 0,//预约单id
    "reserveOpenId": "@string",//预约人微信openid
    "deviceId": 0,//预约设备
    "reserveTime": "@LocalDateTime",//预约时间
    "applyContactPhone": "@string",//预约联系电话
    "applyUserName": "@string",//预约人姓名
    "applyAddress": "@string",//预约地址
    "departmentId": 0,//办公室
    "status": 0,//状态,1已完成,0未处理
    "remark": "@string",//备注
    "version": 0//版本号
  }
}

以上便是我使用中遇到的问题,望回复,谢谢

上传报错

java.lang.NullPointerException
at site.forgus.plugins.apigenerator.yapi.sdk.YApiSdk.getProjectInfo(YApiSdk.java:47)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadHttpMethodsToYApi(ApiGenerateAction.java:112)
at site.forgus.plugins.apigenerator.ApiGenerateAction.uploadApiToYApi(ApiGenerateAction.java:84)
at site.forgus.plugins.apigenerator.ApiGenerateAction.actionPerformed(ApiGenerateAction.java:67)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:280)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:296)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:281)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:285)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:112)
at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:112)
at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:517)
at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:36)
at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:539)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6651)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
at java.desktop/java.awt.Component.processEvent(Component.java:6416)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:912)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:844)
at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:741)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

有个NPE 异常

java.lang.NullPointerException
at site.forgus.plugins.apigeneratorplus.action.ApiGenerateAction.buildYApiInterface(ApiGenerateAction.java:444)
at site.forgus.plugins.apigeneratorplus.action.ApiGenerateAction.buildYApiInterface(ApiGenerateAction.java:425)
at site.forgus.plugins.apigeneratorplus.action.ApiGenerateAction.uploadToYApi(ApiGenerateAction.java:398)
at site.forgus.plugins.apigeneratorplus.action.ApiGenerateAction.uploadHttpMethodsToYApi(ApiGenerateAction.java:215)
at site.forgus.plugins.apigeneratorplus.action.ApiGenerateAction.uploadApiToYApi(ApiGenerateAction.java:158)
at site.forgus.plugins.apigeneratorplus.action.ApiGenerateAction.actionPerformed(ApiGenerateAction.java:123)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:280)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:296)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:281)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:285)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:112)
at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:112)
at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:517)
at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:36)
at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:539)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6650)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
at java.desktop/java.awt.Component.processEvent(Component.java:6415)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5025)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4857)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4857)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:912)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:844)
at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:741)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

生成的doc文档出现乱码

系统 win10
插件版本 2020.09.10
IDEA 版本 2020.1.2 Ultimate

出现类似这样的乱码

²ÎÊý˵Ã÷

Ãû³Æ ÀàÐÍ ±ØÌî ÖµÓò·¶Î§ ÃèÊö/ʾÀý

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.