E4 无法在 class 变量上自动注入 MApplication
E4 cannot auto inject MApplication on class variable
我有一个 E4 应用程序,我需要将 MApplication 注入第一个创建的 class。 class 本身已在我的 Activator 的启动方法中创建并在那里调用。
我的 Class 称为 FrameworkModule,看起来像:
public class FrameworkModule implements ISubscription {
private static final Logger logger = LoggerFactory.getLogger(FrameworkModule.class);
private @Inject IEclipseContext context;
protected @Inject EPartService partService;
protected @Inject MApplication application;
protected @Inject EModelService modelService;
...
}
激活器会创建上面class和运行它的一个方法。激活器的启动方法如下所示:
@Override
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
IEclipseContext eContext = EclipseContextFactory.getServiceContext(bundleContext);
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> {
framework = ContextInjectionFactory.make(FrameworkModule.class, eContext);
framework.startup();
});
service.execute(() -> CacheUtil.getManager());
service.shutdown();
}
代码启动时出现以下错误:
org.eclipse.e4.core.di.InjectionException: Unable to process "FrameworkModule.application": no actual value was found for the argument "MApplication".
at org.eclipse.e4.core.internal.di.InjectorImpl.reportUnresolvedArgument(InjectorImpl.java:488)
at org.eclipse.e4.core.internal.di.InjectorImpl.resolveRequestorArgs(InjectorImpl.java:479)
at org.eclipse.e4.core.internal.di.InjectorImpl.internalInject(InjectorImpl.java:128)
at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:411)
at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:333)
at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:202)
at com.xxx.client.eclipse.Activator.lambda[=13=](Activator.java:84)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
如何在我的 FrameworkModule class 中解决这个问题?我在那里需要所有注入的 classes,但无法找到一种方法。
EclipseContextFactory.getServiceContext
返回的服务上下文只有非常有限的内容,不包括MApplication
。您不能在激活器中像这样创建 class。
具体取决于您要如何使用 class,您可以:
- 在 application.e4xmi 或 fragment.e4xmi
中指定的 'Add-on' 中创建 class
- 只需使用 class 上的
@Creatable
注释自动创建它即可。如果您想要 class. 的单个实例,也可以使用 @Singleton
注释
- 在生命周期中创建它class
- 使用
ContextFunction
创建它
我有一个 E4 应用程序,我需要将 MApplication 注入第一个创建的 class。 class 本身已在我的 Activator 的启动方法中创建并在那里调用。
我的 Class 称为 FrameworkModule,看起来像:
public class FrameworkModule implements ISubscription {
private static final Logger logger = LoggerFactory.getLogger(FrameworkModule.class);
private @Inject IEclipseContext context;
protected @Inject EPartService partService;
protected @Inject MApplication application;
protected @Inject EModelService modelService;
...
}
激活器会创建上面class和运行它的一个方法。激活器的启动方法如下所示:
@Override
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
IEclipseContext eContext = EclipseContextFactory.getServiceContext(bundleContext);
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> {
framework = ContextInjectionFactory.make(FrameworkModule.class, eContext);
framework.startup();
});
service.execute(() -> CacheUtil.getManager());
service.shutdown();
}
代码启动时出现以下错误:
org.eclipse.e4.core.di.InjectionException: Unable to process "FrameworkModule.application": no actual value was found for the argument "MApplication".
at org.eclipse.e4.core.internal.di.InjectorImpl.reportUnresolvedArgument(InjectorImpl.java:488)
at org.eclipse.e4.core.internal.di.InjectorImpl.resolveRequestorArgs(InjectorImpl.java:479)
at org.eclipse.e4.core.internal.di.InjectorImpl.internalInject(InjectorImpl.java:128)
at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:411)
at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:333)
at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:202)
at com.xxx.client.eclipse.Activator.lambda[=13=](Activator.java:84)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
如何在我的 FrameworkModule class 中解决这个问题?我在那里需要所有注入的 classes,但无法找到一种方法。
EclipseContextFactory.getServiceContext
返回的服务上下文只有非常有限的内容,不包括MApplication
。您不能在激活器中像这样创建 class。
具体取决于您要如何使用 class,您可以:
- 在 application.e4xmi 或 fragment.e4xmi 中指定的 'Add-on' 中创建 class
- 只需使用 class 上的
@Creatable
注释自动创建它即可。如果您想要 class. 的单个实例,也可以使用 - 在生命周期中创建它class
- 使用
ContextFunction
创建它
@Singleton
注释