我正在尝试将E3.X应用程序移植到E4并遵循Lars Vogel的tutorial。 我创建了一个视图包装器,它扩展了DIViewPart类,视图本身在构造函数上使用依赖注入,并在我的plugin.xml中引用了视图包装器。
但是,在启动应用程序时会抛出异常:
org.eclipse.e4.core.di.InjectionException: Could not find satisfiable constructor in my.application.views.MyView
即使经过几个小时的谷歌搜索,我也不知道出了什么问题。 也许我只是在寻找错误的东西,但我现在很无能为力。 如果有人能指出我缺少的东西,我会很高兴。
为了确保我在下面添加了受影响的观看源代码:
public class MyViewWrapper extends DIViewPart { public MyViewWrapper() { super(MyView.class); } }
public class MyView { public static final String ID = MyView.class.getCanonicalName(); private Label label; @Inject public MyView(Composite parent) { this.label = new Label(parent, SWT.NONE); this.label.setText("My view"); } }
任何帮助都表示赞赏,并提前致谢。
修改 Stefan指出,问题可能与e4在构造函数调用期间不知道正确的复合并且以下代码应该起作用的事实有关:
public class MyView { public static final String ID = MyView.class.getCanonicalName(); private Label label; public MyView() { } @PostConstruct public void createPartControl(Composite parent) { this.label = new Label(parent, SWT.NONE); this.label.setText("Sensor view"); } }
可悲的是,事实并非如此。 异常发生了变化,但原因可能仍然相同:
org.eclipse.e4.core.di.InjectionException: Unable to find matching method to invoke
我的假设是依赖注入作为一个整体不能正常工作,但我不知道为什么,因为我已经完成了与我发现的教程完全相同的所有内容。 我需要添加.e4xmi或其他东西吗?
答案 0 :(得分:0)
我遇到了与您相同的情况,并通过调试代码找到了解决方案。
查看第213行附近的堆栈跟踪,更具体地说是org.eclipse.e4.core.internal.di.InjectorImpl
类。invoke
方法接收限定符参数,该参数是匹配方法。这个量词是依赖注入正在寻找的东西。
例如,在我的例子中,量词参数是@Focus
注释。因此,通过在 MyView 类中的正确方法上添加@Focus
注释,我能够摆脱您所描述的第二个问题,因为DI找到了正确的匹配方法< / em>来电。
我知道这是几个月前提出的一个问题的答案很晚,但我认为这可以帮助其他人调试,而不用花太多时间。