IntelliJ不识别spray json隐式导入 格式化时被误删该如何解决
问题描述
我在应用开发中使用spray json,需要为模型编写JsonProtocol伴生对象。由于服务内模型数量较多,使用这些JsonProtocols有两种可选方案:
- a) 将
TableauErrorResponseJsonProtocol定义为trait,由我的服务类继承 - b) 将
TableauErrorResponseJsonProtocol定义为object,在服务中需要使用的位置导入
我倾向于不使用方案a,因为我的服务类已经存在多个继承关系,不想再堆叠with x, with y, with z这类继承声明。
但使用方案b时,我执行代码格式化操作(快捷键CTRL + ALT + SHIFT + L)时,IntelliJ会将这些导入判定为「未使用」并自动移除,而实际上这些隐式导入是被后续代码response.data.parseJson.convertTo[MyClass]所使用的。
请问如何避免该问题?
解决方案
以下是经过验证的可行方案,可根据使用场景选择:
- 显式引用Protocol对象
在导入语句下方的任意位置添加一行对Protocol对象的直接引用,无实际执行逻辑,仅用于让IntelliJ识别到导入被使用:import com.xxx.TableauErrorResponseJsonProtocol._ TableauErrorResponseJsonProtocol - 添加未使用检测忽略注解
在对应导入语句上一行添加//noinspection ScalaUnusedImport注解,IntelliJ的优化导入功能会跳过对该导入的检查:
也可以在IDEA弹出「未使用导入」提示时按下//noinspection ScalaUnusedImport import com.xxx.TableauErrorResponseJsonProtocol._Alt + Enter,选择「标记为不检查未使用」,IDEA会自动生成对应注解。 - 调整IntelliJ导入优化规则
打开IDEA设置,依次进入Editor > General > Auto Import > Scala,取消勾选「优化时移除未使用导入」选项,或开启「将隐式使用标记为已使用」开关(部分版本IDEA提供该配置),可全局避免隐式导入被误删。 - 统一管理所有JsonProtocol导入
将项目内所有需要用到的JsonProtocol合并到同一个导入对象中,仅需要导入一次该对象即可引入全部隐式格式,同时在对象内添加空初始化方法,调用后即可避免导入被判定为未使用:
服务代码中使用示例:object ProjectJsonImports extends TableauErrorResponseJsonProtocol with OtherModelJsonProtocol { def init(): Unit = {} }import com.xxx.ProjectJsonImports._ ProjectJsonImports.init() - Scala 3环境使用given导入
若使用Scala 3版本,直接通过given语法导入隐式实例,IntelliJ可正确识别该类导入的使用情况,不会出现误判:import com.xxx.TableauErrorResponseJsonProtocol.given
内容的提问来源于stack exchange,提问作者AlleXyS
相关产品推荐
相关产品推荐

