【发布时间】:2022-10-13 18:03:38
【问题描述】:
我正在尝试保存与步骤相关的状态,该状态可以从处理器访问。为此,我为它创建了一个类和一个 bean。我的配置文件如下所示:
@Slf4j
@Configuration
@EnableScheduling
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MyConfiguration
{
// Job, reader and writer beans
@Bean("myStep")
Step myStep(@Qualifier("myReader") ItemReader<InputEntity> reader,
@Qualifier("myProcessor") ItemProcessor<InputEntity, OutputEntity> processor,
@Qualifier("myWriter") ItemWriter<OutputEntity> writer)
{
return stepBuilderFactory
.get("myStep")
.<InputEntity, OutputEntity> chunk(100)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@StepScope
@Bean("myProcessor")
public MyProcessor processingStep(StateService s)
{
var processor = new MyProcessor();
processor.setStateService(s);
return processor;
}
@Scope(value = "step", proxyMode = ScopedProxyMode.NO)
@Bean
public StateService stateService()
{
return new StateService();
}
}
背后的想法是为每个新的步骤执行创建一个状态服务(该类目前为空,并且没有@Component 注释)。但是,我遇到了 Spring 代理的麻烦:
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'MyProcessor' is expected to be of type 'very.long.package.name.steps.MyProcessor' but was actually of type 'com.sun.proxy.$Proxy265'
收集已经回答的问题和我尝试过的几十个指南:
-
stateServicebean 的所有可能代理模式; - 通过
@Autowired变量将这个bean直接注入MyProcessor - 使用
@EnableBatchProcessing注释配置 - 直接调用
stateService()bean:processor.setStateService(stateService()); - 将 bean 注入步骤
Stepbean。在这种情况下,我必须更改方法签名,因此该方法接受MyProcessor而不是ItemProcessor<InputEntity, OutputEntity>来公开变量
没有任何帮助,我仍然得到这个例外。我对@StepScope 的概念有什么误解?如何存储某些状态以执行特定步骤?
【问题讨论】:
标签: java spring-batch