2019-10-09 · 许进 · · 字数:400·阅读时间 1 分钟 阅读量

1. @Domain行标记修改

Halo框架所创建的应用需要管中台可视化纳管,因此当应用启动的时候会判断当前应用是否属于某个域,不属于某个域将停止启动,HaloTools提供一个快速修改编辑的功能。如下图所示:

如上图所示,可以成功进行行标记代码修改,但是会出现报错信息,下面将对报错信息进行分析Fix。

2.报错分析

java.lang.Throwable: Assertion failed: Write access is allowed inside write-action only (see com.intellij.openapi.application.Application.runWriteAction())
    at com.intellij.openapi.diagnostic.Logger.assertTrue(Logger.java:180)
    at com.intellij.openapi.application.impl.ApplicationImpl.assertWriteAccessAllowed(ApplicationImpl.java:1344)
    at 
  • 大致意思是写的权限只能在Application.runWriteAction()里面是允许的
  • 查询官网资料解释如下图所示:

IDEA行标记修改用到了写文件操作,因此需要在线程中操作,不然会出现文章开头出现的错误。

3. Bug Fix

定位到出错代码,如下所示:

 processor.executeCommand(project, new DocumentReplace(document, startOffset, endOffset, domain), "", document) 

将上述代码放入写操作中,修改如下所示:

@Override
    public void navigate(MouseEvent mouseEvent, PsiElement psiElement)  {

        Application applicationManager = ApplicationManager.getApplication();
        applicationManager.runWriteAction(() -> ➊
                processor.executeCommand(project, new DocumentReplace(document, startOffset, endOffset, domain), "", document) ➋
        );
        DomainModelContext.clearAllSet();
    }

➊ 在applicationManager.runWriteAction线程中开启写操作

➋ 进行行标记代码替换操作