Eclipse Juno迁移至4.24后WorkbenchContext丢失Handler问题求助
解决Eclipse e4 RCP从Juno迁移到4.24后Handler丢失的问题
针对你遇到的WorkbenchContext的localValues中Handler丢失、触发org.eclipse.core.commands.NotHandledException的问题,可按以下步骤排查解决:
1. 检查Handler注解与写法是否符合新版本规范
从Juno到4.24,e4对Handler的注解要求更严格,确保你的Handler类遵循正确的e4注解模式:
- 执行方法需标注
@Execute注解,无需强制继承AbstractHandler或实现IHandler(继承/实现也可,但推荐注解式写法) - 若要绑定到特定命令,需在Handler类上添加
@Command(id="你的命令ID")注解,或在e4xmi中显式绑定
示例正确写法:
import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.core.di.annotations.Command; @Command(id="com.example.commands.mycommand") public class MyHandler { @Execute public void handleCommand() { // 命令执行逻辑 } }
2. 验证fragment.e4xmi中的Handler绑定配置
确认你的fragment.e4xmi中Handler的配置无错误:
- 在
Handlers节点下添加的Handler项,Class URI需正确指向Handler类的bundleclass路径,格式为bundleclass://你的插件ID/完整类路径 Command属性需选择或填写正确的命令ID,确保与命令定义的ID完全匹配- 检查Handler的
Enabled When或Active When条件是否设置错误,导致Handler被过滤掉
3. 检查命令定义的一致性
确保命令本身的定义正确:
- 若通过
plugin.xml的org.eclipse.core.commands.commands扩展点定义命令,需确认命令ID与Handler绑定的ID一致 - 若通过e4xmi的
Commands节点定义命令,需检查命令ID、名称等配置无误,且未被其他插件的同名命令覆盖
4. 手动将Handler注册到WorkbenchContext
如果自动注册失效,可在应用启动阶段手动将Handler注入到WorkbenchContext的localValues中:
- 创建一个LifeCycle类,添加
@PostContextCreate注解的方法 - 在方法中获取
EclipseContext(即WorkbenchContext),将Handler实例绑定到命令对应的键
示例代码:
import org.eclipse.e4.core.contexts.EclipseContext; import org.eclipse.e4.core.di.annotations.Inject; import org.eclipse.e4.core.di.annotations.PostContextCreate; public class AppLifeCycle { private static final String MY_COMMAND_ID = "com.example.commands.mycommand"; @Inject @PostContextCreate public void initWorkbenchContext(EclipseContext workbenchContext) { // 若Handler需依赖注入,改用workbenchContext.get(MyHandler.class)获取容器管理的实例 MyHandler handler = new MyHandler(); // 绑定到命令对应的键,格式为"org.eclipse.core.commands.handlers.命令ID" workbenchContext.set("org.eclipse.core.commands.handlers." + MY_COMMAND_ID, handler); } }
5. 检查插件激活与依赖配置
- 确保包含Handler的插件在
plugin.xml中设置了Bundle-ActivationPolicy: lazy,或插件被正确激活 - 检查插件的MANIFEST.MF中是否添加了必要的依赖,比如
org.eclipse.e4.core.di、org.eclipse.e4.ui.workbench等,避免因缺失依赖导致Handler无法实例化
6. 用Plugin Spy排查Handler绑定状态
使用Eclipse的Plugin Spy工具(快捷键Shift+Alt+F1),选择"Command"选项,输入你的命令ID,查看当前命令的Handler绑定情况,确认是否有正确的Handler被注册,以及是否存在冲突的Handler绑定。
内容的提问来源于stack exchange,提问作者Etienne
相关产品推荐
相关产品推荐

