- 跨模块实现FeignClient导航ApiController功能:FeignClient-ApiController Mutually Navigation
- 跨模块实现ApiController导航FeignClient功能:ApiController-FeignClient Mutually Navigation
适配最新版本的IntelliJ IDEA
[fix] 重大bug修复,修复了由于缓存导致的目标接口动态监测失效的问题
[feat] 重大功能更新,server端适配了springboot配置文件application.properties/application.yml/application.yaml的解析机制:
支持以下配置的解析
- tomcat配置属性:server.servlet.context-path
- springmvc配置属性:spring.mvc.servlet.path
在 Spring Boot 出现之前,Dispatcher Servlet 是在 web.xml 文件中声明的,如下图
<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load -on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>*.test</url-pattern>
</servlet-mapping>
</web-app>这个DispatcherServlet是实际的Servlet,它继承自基类HttpServlet。
在 Spring Boot 出现之后,spring-boot-starter-web starter 自动装配机制将DispatcherServlet默认配置为 URL 模式“/”。
但是,如果需要,我们可以使用自定义 URL 模式。application.properties文件中如下
server.servlet.context-path=/hello
spring.mvc.servlet.path=/world通过上面的配置,DispatcherServlet被配置为处理 URL 模式/world,并且springboot根上下文路径将是/hello。因此,DispatcherServlet监听http://ip/port/hello/world,,as prefix path by @FeignClient,the sample is below
@FeignClient(path = "/hello/world",value = "cloud-feign-server", contextId = "user", configuration = UserConfiguration.class)
public interface UserClient {
@GetMapping(value = "/user/get/{id}")
User getUserById(@PathVariable("id") Long id);
}yml/yaml配置同上。
适配了最新版IDEA的Light主题,欢迎在IDEA内在线更新至4.1.1版本(三天后上线),或者提前安装离线版体验! https://github.com/lyflexi/feignx-plugin/releases/tag/v4.1.1
修复了issues:#3
感谢官方工作人员的指引:Natalia Melnikova (JetBrains Marketplace) marketplace@jetbrains.com
感谢@yann Cebron:https://intellij-support.jetbrains.com/hc/en-us/profiles/1283051161-Yann-Cebron
thanks my friend's pr : #9
- Adapted bootstrap.properties/bootstrap.yml/bootstrap.yaml
- Adapted many writtings of path,as @FeignClient(path = "/sys") and @FeignClient(path = "sys") and @FeignClient(path = "sys/")
极少数分布式场景下的nacos需要以下配置,往往会配置在本地的bootstrap.yml/yaml中,而非application.yml/yaml中
- server.servlet.context-path = /hello
- spring.mvc.servlet.path = /world
此版本修复了FeignX读取本地bootstrap.yml/yaml中上述配置失效的问题
FeignX 4.1.5 is binary incompatible with IntelliJ IDEA Ultimate IU-193.7288.26 due to the following problem Method not found . This can lead to NoSuchMethodError exception at runtime.
Feignx:v4.1.6 resolve IntelliJ IDEA Ultimate 2019.3.51 compatibility problem.
- remove 1 usage of deprecated API (V1.381)
- Invocation of unresolved method PsiEditorUtil.findEditor(PsiElement)
- Method SearchControllerAction.navigateToControllerCode(...) contains an invokestatic instruction referencing an unresolved method PsiEditorUtil.findEditor(PsiElement).
reslove issue #6:#6
- 我们又更名啦[笑哭],由FeignX更名为FeignClient Assistant With RequestX
- 为了方便Vim党,我们支持了url完整路径复制至剪切板(Feign接口和Controller接口均支持)
- 欢迎Star:https://github.com/Halfmoonly/feignx-plugin
朋友们记得先将zip解压出jar包,再离线安装jar包哟~~:https://github.com/user-attachments/files/19149196/Navigator4URL.OpenFeign.RestController-5.1.0.zip
修复分支:hotfix/main-copy-notify
-
我们修复了一键复制URL功能的消息通知失败的问题,以及偶先空指针的现象
-
我们优化了Copy-Gutter和Bird-Gutter的展现位置,将其从方法签名处移至RequestMapping等Rest注解处,这样更加符合直觉
-
我们优化了Copy-Gutter和Bird-Gutter的动态解析,使用户后期在修改方法签名的时候(如添加/**/注释或者添加自定义业务注解的时候),Gutter的位置随着RequestMapping等Rest注解的位置动态生效
-
我们优化了一键复制URL功能的Copy-Gutter图标设计,更加的优雅
对应分支:feat/main-parallel
默认IO密集型程序核心线程数为2*N,并自定义了线程池,优化初始化过程中,构建出全量接口方法对象HttpMappingInfos的速度(ApiControllers和FeignClients)
对应分支:main-fix-dead
- 修复了偶发的卡死现象
对应分支:main-fix-dead2
- 修复了偶发的卡死现象
对应分支:hotfix/main-dead
- feat: 合并了来自开发者的一个特性PR:#14 ,支持Restful注解path中的变量或者静态常量的解析(FeignClient和ApiController),感谢@wdhcr
- fix: 重大bug修复,彻底修复了打开多个IDEA项目时候偶发的卡死现象,我们定位到是线程池的问题并做出了修复与避免。希望反馈的朋友们耐心等待此版本上架
对应分支feat/main-tab-svg
- 我们上线了FeignClient类文件和Tab页签的图标替换功能,默认开启,用户可以在IDEA设置面板中关闭,修改配置后记得重启IDEA。
- 你将体验到全新的UI设计风格,包括URL路径一键复制,希望大家喜欢(❤ ω ❤)
修复分支:hotfix/main-fix-tabsvg
定位到是由于v5.5.0中上线的类文件的图标替换功能导致 PSI 元素失效,影响了原先正常的主流程解析逻辑
- 文件被修改(例如用户编辑代码)。
- PSI 元素的访问必须在 读操作(Read Action) 或 事件分发线程(EDT) 中进行。
- 如果在后台线程(非 EDT)直接访问 PSI 元素,可能导致元素失效。
- 未检查元素有效性等
com.intellij.psi.PsiInvalidElementAccessException: Element: class com.intellij.psi.impl.source.PsiClassImpl #JAVA
invalidated at: see attachment
at com.intellij.psi.impl.source.SubstrateRef$1.getNode(SubstrateRef.java:43)
at com.intellij.extapi.psi.StubBasedPsiElementBase.getNode(StubBasedPsiElementBase.java:133)
at com.intellij.psi.impl.source.PsiClassImpl.getNode(PsiClassImpl.java:102)
at com.intellij.psi.impl.source.PsiClassImpl.getNode(PsiClassImpl.java:36)
at com.intellij.extapi.psi.StubBasedPsiElementBase.getStubOrPsiChild(StubBasedPsiElementBase.java:36
at com.intellij.extapi.psi.StubBasedPsiElementBase.getRequiredStubOrPsiChild(StubBasedPsiElementBase.java:375)
at com.intellij.psi.impl.source.PsiClassImpl.getModifierList(PsiClassImpl.java:170)
at com.intellij.psi.PsiJvmConversionHelper.hasListAnnotation(PsiJvmConversionHelper.java:57)
at com.intellij.psi.PsiModifierListOwner.hasAnnotation(PsiModifierListOwner.java:45)
at com.intellij.psi.PsiJvmModifiersOwner.hasAnnotation(PsiJvmModifiersOwner.java:32)
at com.lyflexi.feignx.utils.AnnotationParserUtils.isFeignInterface(AnnotationParserUtils.java:101)
at com.lyflexi.feignx.resolver.FeignMappingResolver.feignsOfPsiClass(FeignClassScanUtils.java:123)
at com.lyflexi.feignx.resolver.FeignMappingResolver.scanFeignInterfaces(FeignClassScanUtils.java:107)
at com.lyflexi.feignx.provider.C2FLineMarkerProvider.collectNavigationMarkers(Controller2FeignLineMarkerProvider.java:43)
...
修复分支:hotfix/main-fix-tabsvg2
- 修复了回车键可能导致的方法旁gutter失效的问题
修复分支:main
- 修复了二次打开项目的时候,有gutter,但无法跳转的问题
修复分支:hotfix/main-fix-gitpull
- 修复了git pull操作变更了psiclass导致的gutter跳转失效的问题
修复分支:main
- 修复了异常:invalidated at: see attachment
修复分支:main
- 修复了异常:java.lang.Throwable: Smart pointers must not be created during PSI changes
修复分支:main
- 修复了异常:PsiInvalidElementAccessException
修复分支:main
- 重新设计了UI,修复了图标在Tab页签中无法居左显示的问题。
更新分支:main
- 过滤了不必要的psi监听事件消费,提升了psiclass的监听处理性能
修复分支:hotfix/main-fix-psichange-dumb
- 当切换git分支的场景下,修复了当前项目psichange事件监听消费处,索引还未更新完成导致的Dumb异常
优化分支:main
- 优化了UI
优化分支:feat/main-ui2
- 优化了ApiController控制器侧的UI
修复分支:hotfix/main-fix-duplicate-TestEntityManagerAutoConfiguration
- 使用intellij自家判断注解的API,修复了java.lang.Throwable: PersistentFS[connected: true, ownData: com.intellij.openapi.vfs.newvfs.impl.VfsData@675c6da6] returned duplicate file names('TestEntityManagerAutoConfiguration.class', 'TestEntityManagerAutoConfiguration.class') caseSensitive: true SystemInfo.isFileSystemCaseSensitive: false isCaseSensitive(): true SystemInfo.OS: Windows 10.0 wasChildrenLoaded: true in the dir: jar://C:/Users/hasee/.m2/repository/org/springframework/boot/spring-boot-test-autoconfigure/3.0.0/spring-boot-test-autoconfigure-3.0.0.jar!/org/springframework/boot/test/autoconfigure/orm/jpa; 9 children: ["AutoConfigureDataJpa.class"; nameId: 189261; id: 98540 (unknown), "DataJpaTypeExcludeFilter.class"; nameId: 189274; id: 98542 (unknown), "TestEntityManagerAutoConfiguration.class"; nameId: 189302; id: 98544 (unknown), "DataJpaTestContextBootstrapper.class"; nameId: 189323; id: 98547 (unknown), "Te...
优化分支:feat/main-performance
- 我们发现在大型项目中插件的初始化速度较慢,v5.6.4.0通过排除三方依赖中的libs,仅保留用户文件的扫描,提升了PSI扫描的速度
https://plugins.jetbrains.com/plugin/25604-feignclient-assistant
IDEA内插件市场一键安装最方便哟~~
修复了 issues #21 / #23:
- 支持 Restful 注解路径中的常量拼接:
@GetMapping(CONST + "/xxx")、@PostMapping(CONST)、@FeignClient(path = CONST)等写法均可正确解析(含嵌套常量,如 常量 = 常量 + "/xxx")。 - 复制 URL 时支持拼接
@RequestParamquery 参数:方法参数带@RequestParam("code") Integer code时,复制的 Controller/Feign URL 会自动拼入?code=,方便直接粘贴到浏览器/Postman 填充参数。 - 配套新增 sample 测试用例:
ConstantPathServerController(server 端)+UserClientConstant/UserClientFeignConst(client 端),覆盖常量拼接、嵌套常量、@FeignClient path 常量与 @RequestParam 场景。
同时顺带修复了 issue #17:支持从 application-{profile}.yml/yaml/properties、bootstrap-{profile}.yml 等 profile 专属配置文件中解析 server.servlet.context-path / spring.mvc.servlet.path(按 spring.profiles.active 解析,maven 占位符场景兜底扫描 profile 文件)。
修复了 issue #26:feign 接口内部定义的字符串变量拼接跳转不了,如:
@FeignClient(value = "market-api-trade")
public interface TradeInnerOrderFeignApi {
String serverName = "/zzgg/ggpg/server/innerorder";
@PostMapping(value = serverName + "/createsnorder", produces = "application/json")
Result<JSONObject> managementAddShopPayOrderRequest(...);
}- 与 #21/#23(常量来自外部常量类)不同,本次支持常量定义在当前 feign 接口自身(接口字段隐式
public static final),方法路径变量 + "/xxx"、嵌套常量常量 = 常量 + "/xxx"均可正确解析并与 controller 双向跳转。 - 常量解析进一步增强:支持括号包裹的拼接表达式,如
@GetMapping((CONST) + "/xxx")。 - 配套新增 sample 测试用例:
UserClientSelfConst(feign 侧内部变量拼接 + 嵌套常量)+SelfConstServerController(server 侧)。
新增 issue #25 的兜底功能:StatusBar 右下角手动刷新。
- 在 IDEA 右下角 StatusBar 新增一个刷新图标(使用插件图标
pluginIcon.svg,按 StatusBar 紧凑尺寸自适应缩放),点击后手动触发一次全量刷新:- 基于注解索引重新扫描当前工程下所有 Controller 与 FeignClient,并统计扫描结果;
- 重启 Daemon 强制 gutter 导航图标重新计算,兜底解决索引/缓存异常导致的跳转失效。
- 刷新逻辑与 UI 解耦:
com.lyflexi.feignx.core.ProjectRefreshManager独立于 StatusBar 展示层,后续可基于同一入口扩展快捷键 / Action 等触发方式。 - 刷新在后台线程执行,不阻塞 UI;索引未就绪时会给出提示。
- 图标 hover 提示为英文:
Refresh all FeignClients and Controllers。 - 状态栏图标引用
icons/pluginIcon.svg(与META-INF/pluginIcon.svg同内容的副本):插件类加载器下直接加载/META-INF/pluginIcon.svg会显示默认占位图标(咖啡杯),而/icons/目录与 gutter 图标同源、已验证可正常加载;META-INF/pluginIcon.svg仍保留用于插件市场图标。
新增独立功能:右侧"feignx assistant endpoints"端点侧边栏。
- 在 IDEA 右侧新增侧边栏,图标复用 icons/jumpAction_controller.svg,展开后展示工程内全部 SpringMVC 端点与 Feign 端点及其请求路径。
- 端点分为 SpringBoot / SpringMVC / OpenFeign 三个分组(SpringBoot 排最上),分组下先按类、再按请求路径逐级展开(SpringBoot 分组只展示 @SpringBootApplication 启动类);每个请求前标注 GET / POST / PUT / DELETE(泛化 @RequestMapping 显示为 ALL)。
- 类节点左侧使用 gutter 图标区分类型:SpringMVC 类使用 icons/jumpAction_controller.svg,OpenFeign 类使用 icons/jumpAction_feign.svg,SpringBoot 启动类使用经典 Spring 图标 icons/spring.svg,无需配色即可一眼区分。
- 顶部支持:按路径模糊搜索(contains,忽略大小写) + HttpType 请求类型(GET/POST/PUT/DELETE)下拉过滤 + EndpointType(SpringBoot/SpringMVC/OpenFeign)分类下拉过滤,左上角提供刷新按钮,点击后台重新全量扫描;新增"全部展开/全部收起"按钮。
- 双击类节点可跳转到该类源码,双击请求路径节点可跳转到对应接口方法。
- 该功能完全独立实现于 com.lyflexi.feignx.toolwindow 包,不修改任何历史 gutter / 状态栏 / 配置代码,仅复用已有公共扫描工具类。
更新分支:main
- 端点侧边栏右侧新增请求调试面板:左侧搜索树保持不变,右侧布局分为左右两块。
- 左块:点击具体请求节点时,自动生成标准 HTTP 脚本模板(支持 GET / POST / PUT / DELETE),并兼容三类参数——
@RequestBody请求体(递归解析实体类及其字段,生成带字段的 JSON 模板,支持嵌套对象/集合/枚举/日期类型)、@RequestParam请求参数(拼接为 query 串)、@PathVariable路径参数(替换路径占位符为示例值)。 - 左块顶部提供基础地址输入框(默认
http://localhost:8080)与「执行」按钮,点击后在网络后台线程发送真实 HTTP 请求;脚本基于 IntelliJ HTTP Client 格式,可自由编辑。 - 右块展示最近一次请求的响应体(状态码 + 响应头 + 响应体 + 耗时),请求在后台线程执行,不阻塞 UI。
- 新增请求历史功能:每次执行后自动将「请求脚本 + 响应结果」落盘到当前工程
.idea/feignx-history目录(按时间倒序),右块「历史请求」按钮可弹出历史列表(支持输入过滤),选中即可一键回填脚本与响应,方便复用与追溯。
更新分支:main
- 修复端点侧边栏双击请求端点所在整行(含文字右侧空白区域)无法定位到编辑器源码的问题,现在双击该行任意位置即可跳转到对应接口方法/类源码。
- 修复在较新 IDEA(如 2025.3 等)下,Kotlin 插件 Analysis API 服务缺失导致注解扫描抛出
Cannot find service KaGlobalSearchScopeMerger / KotlinProjectStructureProvider、Controller/Feign 之间导航 gutter 消失的问题:改为基于 Java 注解索引(JavaAnnotationIndex)扫描工程内标注类,绕开会触发 Kotlin 注解搜索扩展点的AnnotatedElementsSearch。


