首页 文章

我的bean总是在注入后返回null

提问于
浏览
0

这是我的代码,我不知道为什么我的bean MouvementToMapItemProcessor 没有注入,它在构造函数中始终为null

@Autowired
    private MouvementToMapItemProcessor mvts;

    private Iterator it;

    public InMemoryMouvementReader() {
        it = mvts.getMouvmentFileRowMap().entrySet().iterator();
    }

这是我的配置类:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {


    public BatchConfiguration() {
    }


    @Bean
    public ItemReader<MouvementFileRow> mouvementMapReader() {
        return new InMemoryMouvementReader();
    }


    @Bean
    public ItemProcessor<MouvementFileRow, MouvementFileRow> mouvementMapProcessor() {
        return new MouvementToMapItemProcessor();
    }



    @Bean
    public Step generateDemmandeCommunication() {
        return stepBuilderFactory.get("generateDemmandeCommunication")
                .<MouvementFileRow, DemandeCommunication>chunk(10)
                .faultTolerant().skipLimit(Integer.MAX_VALUE).skip(CustomReaderSkipException.class)
                .reader(mouvementMapReader())
                .processor(mouvementProcessor())
                .writer(demandeCommunicationItemWriter())
                .listener(customStepListener())
                .build();
    }
public class InMemoryMouvementReader implements ItemReader<MouvementFileRow> {

    @Autowired
    private MouvementToMapItemProcessor mvts;

    private Iterator it;

    public InMemoryMouvementReader() {
        it = mvts.getMouvmentFileRowMap().entrySet().iterator();
    }

    private void initialize() {
    }

    @Override
    public MouvementFileRow read() throws Exception {
        if (it.hasNext()) {
            return mvts.getMouvmentFileRowMap().get(it.next());
        } else return null;
    }
}
@Component
public class MouvementToMapItemProcessor implements ItemProcessor<MouvementFileRow, MouvementFileRow> {

    private static final Logger log = LoggerFactory.getLogger(MouvementToMapItemProcessor.class);

    private Map<Long, MouvementFileRow> mouvmentFileRowMap;

    public MouvementToMapItemProcessor() {
        mouvmentFileRowMap = new HashMap<Long, MouvementFileRow>();

    }

    @Override
    public MouvementFileRow process(final MouvementFileRow mouvement) throws Exception {
        ........
        return null;
    }

    public Map<Long, MouvementFileRow> getMouvmentFileRowMap() {
        return mouvmentFileRowMap;
    }

我的堆栈跟踪

启动ApplicationContext时出错 . 要显示自动配置报告,请在启用“debug”的情况下重新运行应用程序 . 11:55:29.139 [restartedMain]错误osboot.SpringApplication - 应用程序启动失败org.springframework.beans.factory.BeanCreationException:在类路径资源中定义名为'mouvementMapReader'的bean时出错[fr / gouv / justice / spark / fileToBaseBatch /BatchConfiguration.class]:通过工厂方法的Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.batch.item.ItemReader]:工厂方法'mouvementMapReader'抛出异常;嵌套异常是org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)中的java.lang.NullPointerException,位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)在org.springframework.beans.factory .support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(在org.springfra上的DefaultSingletonBeanRegistry.java:230) mework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)位于org.springframework.beans.factory.support的org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) . 位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)的org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)中的DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) .springframework.boot.SpringApplication.refresh(SpringApplication.java:693)org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)位于or.g.springframework.boot.SpringApplication.run(SpringApplication.java:1107)的fr.gouv.justice.sp ark.fileToBaseBatch.Application.main(Application.java:18)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43)atg.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)中的java.lang.reflect.Method.invoke(Method.java:498)引起:org.springframework .beans.BeanInstantiationException:无法实例化[org.springframework.batch.item.ItemReader]:工厂方法'mouvementMapReader'引发异常;嵌套异常是org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)中的java.lang.NullPointerException,位于org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ...省略了22个常见帧引起:java.lang.NullPointerException:在fr.gouv.justice.spark.fileToBaseBatch的fr.gouv.justice.spark.fileToBaseBatch.readers.InMemoryMouvementReader . (InMemoryMouvementReader.java:19)中为null . BatchConfiguration.mouvementMapReader(BatchConfiguration.java:74)at fr.gouv.justice.spark.fileToBaseBatch.BatchConfiguration $$ EnhancerBySpringCGLIB $$ e3e5804e.CGLIB $ mouvementMapReader $ 34()at fr.gouv.justice.spark.fileToBaseBatch.BatchConfiguration $$ EnhancerBySpringCGLIB $$ e3e5804e $$ FastClassBySpringCGLIB $$ 8f516405.invoke()at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)atorg.springframework.context.annotation.ConfigurationClassEnhancer $ BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358)at fr.gouv.justice.spark.fileToBaseBatch.BatchConfiguration $$ EnhancerBySpringCGLIB $$ e3e5804e.mouvementMapReader()at sun.reflect.NativeMethodAccessorImpl.invoke0 (本地方法)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498) )org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)...省略了23个常用帧

1 回答

  • 0

    你的 MouvementToMapItemProcessor 在构造之前没有被注入 InMemoryMouvementReader ,这是导致构造函数失败并出现NullPointerException的原因 . 请改用构造函数注入:

    @Autowired
    public InMemoryMouvementReader(MouvementToMapItemProcessor mvts) {
        this.mvts = mvts;
        it = mvts.getMouvmentFileRowMap().entrySet().iterator();
    }
    

    @Bean
    public ItemReader<MouvementFileRow> mouvementMapReader(MouvementToMapItemProcessor mvts) {
        return new InMemoryMouvementReader(mvts);
    }
    

    @Bean
    public Step generateDemmandeCommunication(InMemoryMouvementReader reader, MouvementToMapItemProcessor mvts) {
        return stepBuilderFactory.get("generateDemmandeCommunication")
                .<MouvementFileRow, DemandeCommunication>chunk(10)
                .faultTolerant().skipLimit(Integer.MAX_VALUE).skip(CustomReaderSkipException.class)
                .reader(reader)
                .processor(mvts)
                .writer(demandeCommunicationItemWriter())
                .listener(customStepListener())
                .build();
    }
    

相关问题