我有一个归档类,其结构如下:
public class Archive implements Tasklet, StepExecutionListener{
@Inject
private Configuration configuration;
public static final String FF = "ff";
@Override
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1)
throws Exception {
System.out.println("in execute method :)");
return RepeatStatus.FINISHED;
}
@Override
public ExitStatus afterStep(StepExecution arg0) {
return ExitStatus.COMPLETED;
}
@Override
public void beforeStep(StepExecution arg0) {
JobExecution jobExecution = arg0.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
Properties properties = configuration.getPrefixProperties(FF);
filePath = properties.getProperty("fd.folder");
fileName = "test.csv";
}
}我的活页夹类如下:
@Singleton
public class EWM extends AbstractModule {
@Inject
private static Injector injectorInstance;
private static final EWM instance = new EWM();
public static final EWM getInstance() {
return instance;
}
public static Injector getInjector() {
return injectorInstance;
}
public EWM() {
}
@Override
protected void configure() {
bind(Archive.class);
requestInjection(LoggingAspect.class);
}
}我正在获得空配置对象。我不知道为什么配置是空的。谁能帮我找出原因。
发布于 2015-05-20 13:54:16
你的问题中没有足够的信息来回答它,但我可以给你一些关于去哪看的建议。
Guice试图阻止null的注入,所以Archive很可能根本没有被注入。有几个原因可能会发生:
@Inject构造函数,它不设置configuration字段@Inject字段。从构造函数中删除@Inject注释。
Injector#getInstance()直接实例化存档,它是否是由注入器实例化的某个域上的一个域?
发布于 2015-06-16 19:58:31
我怀疑configuration为null的原因是因为类不是由Guice创建的。
为了防止这种情况,为设计由Guice创建的类提供了包范围或私有构造函数。
public class Archive implements Tasklet, StepExecutionListener {
private static final String FF = "ff";
private final Configuration configuration;
@Inject
Archive(Configuration configuration) {
this.configuration = configuration;
}
...我选择了包范围构造函数,因为我希望为类编写单元测试(参见下面的说明)。
如果您想让Archive成为单例,请用@Singleton注释类。
下面是上述类的一个简单模块:
public class ArchiveModule extends AbstractModule {
@Override
protected void configure() {
bind(Archive.class);
}
}bind()调用并不是真正需要的--模块实际上也不需要--但是我喜欢使用它,所以我知道如果模块安装了,如果不能为Archive类创建依赖项,Guice会在注入器创建时出现错误。
在您的主目录中,将有如下代码:
Main main = Guice.createInjector(
new ArchiveModule(),
new AnotherModule(),
... );
main.run();一些注意事项:
injector字段将永远不会被设置(除非您请求模块上的静态注入,但我强烈建议不要这样做)https://stackoverflow.com/questions/30345223
复制相似问题