Generate API documents to any place: YApi, RAP2, Eolinker, etc. (一键生成API接口文档, 上传到YApi, Rap2, Eolinker等平台的IDEA插件)

Overview

Yapi X

👏 👏 👏 本项目已收录到YApi, Rap2官方仓库

一键生成API接口文档, 上传到YApi, Rap2, Eolinker等平台的IDEA插件.

🐮 亮点

  • 零成本、零入侵: 编写标准Javadoc即可,无需依赖swagger注解, 生成API文档准确性高达99%。
  • 开箱即用、智能mock规则: 几乎零配置直接可生成文档,也支持复杂配置满足你95%的场景。
  • 多平台支持:支持YApi, Rap2, Eolinker等,并支持账户密码登录

🐱 特性

  • 一键从源代码生成api文档
  • 上传到YApi平台
  • 上传到Rap2平台
  • 上传到Eolinker平台
  • 上传到ShowDoc平台
  • 导出markdown文件
  • 复制为cURL命令

使用

  1. 安装: 打开Idea -> File -> Settings -> Plugins, 搜索: Yapi X
  2. 配置: 项目根目录创建".yapix"文件, 内容: yapiProjectId=110
  3. 上传: 光标放置在你的控制类或方法,右键执行: Upload To YApi ( 提示:如果未填登录信息,会弹窗提示 )

更多:十分钟使用指南

交流

欢迎提出您的发现问题、需求、建议、以及提交代码来参与贡献。

提示:如果您准备为该插件开发一个新功能,请先通过issues讨论,避免重复开发。

捐赠

非常感谢您使用Yapi X,如果贵公司有非通用的定制开发需求,可提供有偿定制开发服务。

谁在使用

wxb

Comments
  • 推送 RAP2 报错

    推送 RAP2 报错

    IDEA版本:2022.2

    推送到RAP2报错 Config file error: Failed making field 'java.util.regex.Pattern#pattern' accessible; either change its visibility or write a custom TypeAdapter for its declaring type

    opened by jianlong1994 6
  • 希望可以支持 RESTful 风格 get接口正则

    希望可以支持 RESTful 风格 get接口正则

    接口

    /**
       * 根据id查询工单详情
       *
       * @param id 任务Id
       * @return 数据详情
       */
      @GetMapping("/{id:\\d+}")
      public ApiResult getInfo(@PathVariable String id) {
    
    image

    错误信息

    io.yapix.base.sdk.yapi.YapiException: path第一位必需为 /, 只允许由 字母数字-/_:.! 组成 at 
    io.yapix.base.sdk.yapi.YapiClient.doHandleResponse(YapiClient.java:227) at 
    io.yapix.base.sdk.yapi.AbstractClient.execute(AbstractClient.java:99) at 
    io.yapix.base.sdk.yapi.AbstractClient.doRequest(AbstractClient.java:55) at 
    io.yapix.base.sdk.yapi.YapiClient.requestPost(YapiClient.java:186) at 
    io.yapix.base.sdk.yapi.YapiClient.saveInterface(YapiClient.java:136) at 
    io.yapix.process.yapi.process.YapiUploader.addOrUpdate(YapiUploader.java:97) at 
    io.yapix.process.yapi.process.YapiUploader.upload(YapiUploader.java:33) at 
    io.yapix.process.yapi.YapiUploadAction.lambda$handle$0(YapiUploadAction.java:63) at 
    io.yapix.action.AbstractAction$1.lambda$run$0(AbstractAction.java:235) at 
    java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at 
    java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at 
    java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at 
    java.base/java.lang.Thread.run(Thread.java:829)
    
    opened by gclm 5
  • feat: 希望能支持组合注解的场景

    feat: 希望能支持组合注解的场景

    作者好 目前业务上,可能会对@Controller(@RestController)在进一步包装 举个例子 定义一个@ValidController的注解 它是 @Valid 和 @Controller 的组合注解 例如

    @Validated
    @RestController
    public @interface ValidController {
    
        @AliasFor(annotation = Controller.class) String value() default "";
    }
    

    这时候 对于加上了这个注解的Controller类 yapix会认为他不是合法的controller 因此不进行接口的上传 想问一下可否加入对这种场景的支持呢 谢谢

    opened by xyohn 4
  • 提交到YApi上的接口状态以及请求的时间参数格式

    提交到YApi上的接口状态以及请求的时间参数格式

    1.通过插件提交到YApi上面的接口状态全部都是未完成,希望有对应的注解或者提交后都是已完成状态

    2.通过插件提交到YApi上面的接口的请求参数无论是LocalDate、LocalDateTime、Date 在备注栏都是 yyyy-MM-dd HH:mm:ss 希望LocalDate和LocalDateTime 有区分(如以下两张图片)

    image

    image

    opened by LY5216 3
  • @RequestMapping识别不到

    @RequestMapping识别不到

    @RestController
    @RequestMapping(value = "/index")
    public class DemoController {
        /**
         * 测试接口
         * @return
         */
        @RequestMapping(value = "/demo", method = RequestMethod.POST)
        public String hotMap() {
            return "demo";
        }
    
    }
    

    类似上边的Demo,upload to yapi 异常: java.lang.NullPointerException at io.yapix.model.HttpMethod.of(HttpMethod.java:21) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at io.yapix.parse.parser.PathParser.parseRequestMappingAnnotation(PathParser.java:89) at io.yapix.parse.parser.PathParser.parse(PathParser.java:41) at io.yapix.parse.ApiParser.parseMethod(ApiParser.java:144) at io.yapix.parse.ApiParser.parse(ApiParser.java:61) at io.yapix.action.AbstractAction.parse(AbstractAction.java:118) at io.yapix.action.AbstractAction.actionPerformed(AbstractAction.java:90) 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)

    opened by YangMenKum 3
  • fix: 接口常量字段未被过滤

    fix: 接口常量字段未被过滤

    public static boolean isNeedField(PsiField field) {
        PsiModifierList modifierList = field.getModifierList();
        if (modifierList == null || !modifierList.hasExplicitModifier(PsiModifier.STATIC)) {
            return true;
        }
        return false;
    }
    public interface TestInterface{
        Map<String,Integer> FIELD_MAPPINGS = Map.of("1",2,"3",4);
    }
    

    image

    opened by BOFA1ex 3
  • feat:建议导出接口支持 ResponseBodyAdvice 统一返回配置

    feat:建议导出接口支持 ResponseBodyAdvice 统一返回配置

    为了代码简洁,通常springboot项目都会实现org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice<T> 这个类去做统一响应处理。例如:

    /**
     * 统一响应结果
     */
    @Data
    public class Result<T> implements Serializable {
        private static final long serialVersionUID = 8925927757015090232L;
        /** 响应编码 */
        private String code;
        /** 响应消息 */
        private String msg;
        /** 响应数据 */
        private T data;
    }
    
    /**
     * 统一处理响应结果
     * 处理后,不需要在Controller层的每个接口返回结果再包一层Result<T>
     */
    @Slf4j
    @RestControllerAdvice
    public class ResponseAdvice implements ResponseBodyAdvice<Object> {
        @Override
        public boolean supports(MethodParameter returnType, Class converterType) {
            return true;
        }
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                      Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                      ServerHttpRequest request, ServerHttpResponse response) {
            if (body instanceof Result) {
                return body;
            }
            return Result.success(body);
        }
    }
    
    /**
     * 测试实体类
     */
    @Data
    public class TestDTO implements Serializable {
        private static final long serialVersionUID = -5026639589154791246L;
        /** 
         * 名称
         * */
        private String name;
        /**
         * 性别
         */
        private String gender;
    }
    
    @Slf4j
    @Validated
    @RestController
    @RequestMapping("test")
    public class TestController {
        /**
         * 测试接口
         * @return 结果对象
         */
        @GetMapping
        public TestDTO test(){
            TestDTO entity = new TestDTO();
            entity.setGender("男");
            return entity;
        }
    }
    

    经过统一处理,接口test()最终返回结果如下:

    {
      "code": "00000",
      "msg": "成功",
      "data": {
        "name": "名称",
        "gender": "男"
      }
    }
    

    理论上对应的接口文档响应结果字段应该是这样的:

    | | | | | | | :----- | :----- | :------- | :------- | :----------------- | | 名称 | 类型 | 是否必须 | 备注 | 其他信息 | | code | string | 非必须 | 响应编码 | | | msg | string | 非必须 | 响应消息 | | | data | object | 非必须 | 响应数据 | 备注: 响应数据 | | name | string | 非必须 | 名称 | | | gender | string | 非必须 | 性别 | |

    但是实际只生成了如下文档:

    | | | | | | | :----- | :----- | :------- | :--- | :------- | | 名称 | 类型 | 是否必须 | 备注 | 其他信息 | | name | string | 非必须 | 名称 | | | gender | string | 非必须 | 性别 | |

    因此建议插件增加一个结果类型(Result)配置开关,如果开启并配置了这个Result类,当扫描接口返回结果类型时,如果类型是Result类,则直接生成文档;如果不是,则包上这一层Result类,再生成接口文档。 这样,才不会生成错误的接口文档。

    question 
    opened by lunfangyu 2
  • feat: 支持接口/实体类 @see引用派生类获取扁平化字段列表信息

    feat: 支持接口/实体类 @see引用派生类获取扁平化字段列表信息

    存在以下场景, 返参类型是JobDTO. 其字段content接口响应结果为向下转型后的派生类对象. 因此接口文档中关于content@object的描述需要涵盖NormalJobContentDTO/WorkflowJobContentDTO内的所有字段.

    public class JobDTO {
        /**
         * 任务实例内容
         * [note]返回对象为向下转型后的派生类
         */
        private JobContentDTO content;
    }
    
    /**
     * @see NormalJobContentDTO
     * @see WorkflowJobContentDTO
     */
    public interface JobContentDTO {
    
    }
    
    public class NormalJobContentDTO implements JobContentDTO {
        /**
         * 任务实例#field0
         */
        private Integer field0;
    }
    
    public class WorkflowJobContentDTO implements JobContentDTO {
        /**
         * 工作流实例#子任务DAG
         */
        private String dags;
    }
    

    接口文档大致如下 image

    opened by BOFA1ex 2
  • IDEA 2022.2 ERROR

    IDEA 2022.2 ERROR

    idea 2020就可以 idea 2022.2报错如下

    com.google.gson.JsonIOException: Failed making field 'java.util.regex.Pattern#pattern' accessible; either change its visibility or write a custom TypeAdapter for its declaring type at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:22) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:158) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101) at com.google.gson.Gson.getAdapter(Gson.java:501) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:116) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:165) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101) at com.google.gson.Gson.getAdapter(Gson.java:501) at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53) at com.google.gson.Gson.getAdapter(Gson.java:501) at com.google.gson.Gson.fromJson(Gson.java:990) at com.google.gson.Gson.fromJson(Gson.java:956) at com.google.gson.Gson.fromJson(Gson.java:905) at io.yapix.config.YapixConfig.fromProperties(YapixConfig.java:151) at io.yapix.config.YapixConfig.getMergedInternalConfig(YapixConfig.java:161) at io.yapix.action.AbstractAction.resolveConfig(AbstractAction.java:195) at io.yapix.action.AbstractAction.actionPerformed(AbstractAction.java:80) at com.intellij.openapi.actionSystem.ex.ActionUtil.doPerformActionOrShowPopup(ActionUtil.java:315) at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performActionDumbAwareWithCallbacks$4(ActionUtil.java:294) at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareWithCallbacks(ActionUtil.java:337) at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAwareWithCallbacks(ActionUtil.java:294) at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$performAction$4(ActionMenuItem.java:293) at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:224) at com.intellij.openapi.actionSystem.impl.ActionMenuItem.performAction(ActionMenuItem.java:286) at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$new$0(ActionMenuItem.java:67) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972) at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$3(ActionMenuItem.java:109) at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:105) at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94) at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:109) at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:546) at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:578) at java.desktop/java.awt.Component.processMouseEvent(Component.java:6648) at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3392) at java.desktop/java.awt.Component.processEvent(Component.java:6413) at java.desktop/java.awt.Container.processEvent(Container.java:2266) at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5022) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4854) at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948) at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575) at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310) at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2802) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4854) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:781) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:730) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:724) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:754) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:752) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:751) at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:898) at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:820) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:743) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:439) at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:791) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:438) at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:113) at com.intellij.ide.IdeEventQueue.performActivity(IdeEventQueue.java:604) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:436) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:881) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:484) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92) Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private java.lang.String java.util.regex.Pattern.pattern accessible: module java.base does not "opens java.util.regex" to unnamed module @c9347be at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) at java.base/java.lang.reflect.Field.setAccessible(Field.java:172) at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:19) ... 72 more

    opened by quicksandznzn 1
  • idea中使用插件上传文档至yapi提示Yapi X: The current class must declare category

    idea中使用插件上传文档至yapi提示Yapi X: The current class must declare category

    插件版本:0.9.2

    错误提示信息:Yapi X: The current class must declare category

    源代码如下:

    @RestController
    @RequestMapping("/v1/auth")
    @ShenyuSpringMvcClient(path = "/v1/auth/**")
    public class SynergyAuthController {
    
        private final SynergyAuthService authService;
    
        @Autowired
        public SynergyAuthController(SynergyAuthService authService) {
            this.authService = authService;
        }
    
        /**
         * 切换租户
         *
         * @param param 选择的租户
         * @return 状态
         */
        @PostMapping("/group/switchover")
        public Result<AuthGroupSwitchoverVO> groupSwitchover(@RequestBody @Valid AuthGroupSwitchoverParam param) {
            return Result.success(authService.groupSwitchover(param));
        }
    
        /**
         * 扫码验证
         *
         * @param param 验证状态
         * @return 状态
         */
        @PostMapping("/valid/make")
        public Result<AuthValidMakeVO> validMake(@RequestBody @Valid AuthValidMakeParam param) {
            return Result.success(authService.validMake(param));
        }
    
    }
    
    opened by TwistedRiCen 1
Releases(v1.1.0)
Owner
Jetplugins
Jetplugins build great intellij plugins.
Jetplugins
Hide xposed, root, file redirection, etc.

FakeXposed 中文文档点击 这里 公众号 关注我的公众号可以第一时间收到我的最新原创技术文章分享 Changlog Changelog Project description Use fake-linker to combine with Xposed, provide Java and N

sanfengAndroid 524 Dec 28, 2022
Distributed ID Generate Service

Leaf There are no two identical leaves in the world. — Leibnitz 中文文档 | English Document Introduction Leaf refers to some common ID generation schemes

美团 5.7k Dec 29, 2022
🔥 强大的动态线程池,附带监控线程池功能(没有依赖任何中间件)。Powerful dynamic thread pool, does not rely on any middleware, with monitoring thread pool function.

ThreadPool, so easy. 动态线程池监控,主意来源于美团技术公众号 点击查看美团线程池文章 看了文章后深受感触,再加上最近线上线程池的不可控以及不可逆等问题,想做出一个兼容性、功能性、易上手等特性集于一身的的开源项目。目标还是要有的,虽然过程可能会艰辛 目前这个项目是由作者独立开发,

龙台 3.4k Jan 3, 2023
🔥 强大的动态线程池,附带监控线程池功能(没有依赖任何中间件)。Powerful dynamic thread pool, does not rely on any middleware, with monitoring thread pool function.

?? 动态线程池系统,包含 Server 端及 SpringBoot Client 端需引入的 Starter. 动态线程池监控,主意来源于美团技术公众号 点击查看美团线程池文章 看了文章后深受感触,再加上最近线上线程池的不可控以及不可逆等问题,想做出一个 兼容性、功能性、易上手等特性 集于一身的的

龙台 3.4k Jan 3, 2023
Provides many useful CRUD, Pagination, Sorting operations with Thread-safe Singleton support through the native JDBC API.

BangMapleJDBCRepository Inspired by the JpaRepository of Spring framework which also provides many capabilities for the CRUD, Pagination and Sorting o

Ngô Nguyên Bằng 5 Apr 7, 2022
EBQuery allows you to easily access databases through a REST API.

EBQuery Table of Contents Introduction - Enterprise Backend as a Service Requirements Getting started Using EBQuery Features Introduction - Enterprise

null 15 Nov 9, 2021
Android app for Ribbit, Broker API Reference App

Ribbit Reference Implementation (Android) The reference implementation for designing the Android user interface of a broker-dealer trading application

Alpaca 12 Nov 24, 2022
Database with Java Swing UI that stores consumables (food & drink) using RESTful API to send commands via HTTP

Database with Java Swing UI that stores consumables (food & drink) using RESTful API to send commands via HTTP.

Bryan 2 Mar 8, 2022
cglib - Byte Code Generation Library is high level API to generate and transform Java byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access.

cglib Byte Code Generation Library is high level API to generate and transform JAVA byte code. It is used by AOP, testing, data access frameworks to g

Code Generation Library 4.5k Jan 8, 2023
Generate Java types from JSON or JSON Schema and annotates those types for data-binding with Jackson, Gson, etc

jsonschema2pojo jsonschema2pojo generates Java types from JSON Schema (or example JSON) and can annotate those types for data-binding with Jackson 2.x

Joe Littlejohn 5.9k Jan 5, 2023
Development Driven Testing (DDT) lets you generate unit tests from a running application. Reproduce a bug, generate a properly mocked test

DDTJ: It kills bugs DDT is the flip side of TDD (Test-driven development). It stands for "Development Driven Tests". Notice that it doesn’t contradict

null 4 Dec 30, 2021
LINE 4.1k Jan 2, 2023
LINE 4.1k Dec 31, 2022
QuickShop is a shop plugin that allows players to easily sell/buy any items from a chest without any commands.

QuickShop is a shop plugin that allows players to easily sell/buy any items from a chest without any commands. In fact, none of the commands that QuickShop provides are ever needed by a player.

Ghost_chu 24 Dec 30, 2022
🎉Ultimate test automation for testing any application on any platform

boyka-java Ultimate test automation for testing any application on any platform boyka-java Setup Write conventional commits 1.

Wasiq Bhamla 52 Dec 30, 2022
Web-based notebook that enables data-driven, interactive data analytics and collaborative documents with SQL, Scala and more.

Apache Zeppelin Documentation: User Guide Mailing Lists: User and Dev mailing list Continuous Integration: Contributing: Contribution Guide Issue Trac

The Apache Software Foundation 5.9k Jan 8, 2023