我有一个简单的课程,如下所示:
class MyClass {
private static SomeClass object = null;
public void init(Someclass injectedObject) {
object = injectedObject;
}
}
我在 Guice 模块中初始化这个类:
public class MyModule extends AbstractModule {
@Provides @Singleton
public SomeClass getStuff() {
SomeClass injectObject = new SomeClass();
MyClass.init(injectObject);
}
}
但是当我打包 jar 并将其作为作业提交到 Flink 运行时时,我收到一条错误消息
NullPointerException: object in MyClass in null
我什至尝试将其添加到我的方法中:
public static void main(String[] args) {
// Guice stuff
}
public void doStuff() {
MyClass.init(injectedObject);
}
我错过了什么吗?为什么已初始化的变量在 Flink 运行时会重置为 null?
有一种更好的方法使用 Guice 注入静态变量:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(SomeClass.class).in(Scopes.SINGLETON);
requestStaticInjection(MyClass.class);
}
}
class MyClass {
@Inject private static SomeClass object;
// no init method needed
}
但是,如果您可以完全省略
static
字段,那就更好了:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(SomeClass.class).in(Scopes.SINGLETON);
bind(MyClass.class);
}
}
class MyClass {
private final SomeClass object;
@Inject
MyClass(SomeClass object) {
this.object = object;
}
}
现在,您可以通过注入或直接从
MyClass
请求它们来请求 injector
实例,并且它们都可以访问同一个 SomeClass
实例。