Java spring批处理:作用域(“步骤”)失败
我可以在xml配置中使用scope=“step”而不会出现任何问题,但如果使用它作为注释,如下所示 . 它抛出以下错误Java spring批处理:作用域(“步骤”)失败,java,spring,Java,Spring,我可以在xml配置中使用scope=“step”而不会出现任何问题,但如果使用它作为注释,如下所示 . 它抛出以下错误 原因:org.springframework.beans.factory.unsatifiedpendencyException:创建名为“step1”的bean时出错,该bean在类路径资源[BatchConfiguration.class]中定义:未满足的依赖项通过构造函数参数表示,索引1的类型为[org.springframework.batch.item.ItemRea
原因:org.springframework.beans.factory.unsatifiedpendencyException:创建名为“step1”的bean时出错,该bean在类路径资源[BatchConfiguration.class]中定义:未满足的依赖项通过构造函数参数表示,索引1的类型为[org.springframework.batch.item.ItemReader]::创建名为“reader”的bean时出错:作用域“step”对于当前线程不是活动的;如果您想从一个单体引用它,请考虑为这个bean定义一个作用域代理;嵌套的异常是java.lang.IllegalStateException:没有可用于步骤范围的上下文持有者;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“reader”的bean时出错:当前线程的作用域“步骤”未处于活动状态;如果您想从一个单体引用它,请考虑为这个bean定义一个作用域代理;嵌套异常为java.lang.IllegalStateException:没有可用于步骤范围的上下文持有者
要点是:
作用域“步骤”对于当前线程不处于活动状态
根本原因是什么
public class BatchConfiguration {
@Bean
@Scope("step")
public ItemReader<Source> reader(@Value("#{jobParameters['fileName']}") String fileName) {
System.out.println("*****************************");
System.out.println("read file of "+fileName);
System.out.println("*****************************");
FlatFileItemReader<Source> reader = new FlatFileItemReader<Source>();
reader.setResource(new FileSystemResource(fileName));
reader.setLineMapper(new DefaultLineMapper<Source>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] { "firstName", "lastName" });
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Source>() {{
setTargetType(Source.class);
}});
}});
return reader;
}
公共类批处理配置{
@豆子
@范围(“步骤”)
公共项目阅读器(@Value(“#{jobParameters['fileName']}”)字符串文件名){
System.out.println(“*************************************”);
System.out.println(“读取文件”+文件名);
System.out.println(“*************************************”);
FlatFileItemReader=新的FlatFileItemReader();
setResource(新文件系统资源(文件名));
reader.setLineMapper(新的DefaultLineMapper(){{
setLineTokenizer(新的DelimitedLineTokenizer(){{
setNames(新字符串[]{“firstName”,“lastName”});
}});
setFieldSetMapper(新的BeanRapperFieldSetMapper(){{
setTargetType(Source.class);
}});
}});
返回读取器;
}
您需要使用以下两种方法之一
@Scope(value="step",
proxyMode=TARGET_CLASS)
或
我不理解@Scope(“step”)和@StepScope之间的区别,尽管它解决了我的问题。请您解释一下它们之间的区别好吗?如果您检查一下实现,
@StepScope
相当于@Scope(value=“step”,proxyMode=ScopedProxyMode.TARGET\u CLASS)
。
@Bean
@StepScope