【问题标题】:NullPointerException when trying to read Database Queries in spring batch ItemProcessor尝试在春季批处理 ItemProcessor 中读取数据库查询时出现 NullPointerException
【发布时间】:2020-08-20 11:00:42
【问题描述】:
        public class TransactionHistoryCsvItemProcessor  implements ItemStream, ItemProcessor<TransactionHistory,TransactionHistory>{
            @Autowired
            private TransactionHistoryRepository transactionHistoryRepository;
            @Autowired
            private ProductHierarchyRepository productHierarchyRepository;
            @Autowired
            private LocationHierarchyRepository locationHierarchyRepository;


            List<TransactionHistory>list= transactionHistoryRepository.findAll();
            List<String> pLevel7Products = productHierarchyRepository.getPLevel7Ids();
            List<String> level5locations=locationHierarchyRepository.getLevel5Ids();


            int count=1;

            TransactionHistoryCsvItemProcessor(){

            }


            private Set<TransactionHistory> processedData = new HashSet<TransactionHistory>();
            @Override
            public TransactionHistory process(TransactionHistory transactionHistory) throws Exception {

                TransactionHistory processedObj = new TransactionHistory(); 

                    if (pLevel7Products.contains(transactionHistory.getProductId().trim())) {

                        if (level5locations.contains(transactionHistory.getLocationId().trim())) {

                            if(list!=null&&!list.isEmpty()){
                                 if(list.contains(transactionHistory)){
                                     count++;
                                     throw new MyOwnException(" duplicates data error", transactionHistory.getProductId().trim(),
                                                transactionHistory.getLocationId().trim(), transactionHistory.getPeriodId(),
                                                transactionHistory.getQuantity(), "at line numer ", count-1);
                                }
                            }

                                      processedObj.setProductId(transactionHistory.getProductId().trim());
                                        processedObj.setLocationId(transactionHistory.getLocationId().trim());
                                        processedObj.setQuantity(transactionHistory.getQuantity());
                                        processedObj.setPeriodId(transactionHistory.getPeriodId());
                                        processedObj.setCreatedDate(LocalDate.now());
                                        processedData.add(transactionHistory);
                                        transactionHistory.setItemCount(count);
                                        count++;

                        }else {
                            System.out.println("failed location");
                            count++;
                            transactionHistory.setItemCount(count);
                            throw new MyOwnException(" location data error", transactionHistory.getProductId().trim(),
                                    transactionHistory.getLocationId().trim(), transactionHistory.getPeriodId(),
                                    transactionHistory.getQuantity(), "at line numer ", count-1);
                        }
                    } else {
                        System.out.println("failed product");
                        // count++;
                        try {
                            transactionHistory.setItemCount(count);
                            throw new MyOwnException(" product data error", transactionHistory.getProductId().trim(),
                                    transactionHistory.getLocationId().trim(), transactionHistory.getPeriodId(),
                                    transactionHistory.getQuantity(), "at line numer ", count);
                        } catch (MyOwnException e) {
                            System.out.println("product error");
                            throw new MyOwnException(" product data error", transactionHistory.getProductId().trim(),
                                    transactionHistory.getLocationId().trim(), transactionHistory.getPeriodId(),
                                    transactionHistory.getQuantity(), "at line numer ", count);

                        } finally {
                            count++;
                        }
                    }

                //}

                if (processedObj.getProductId() == null && processedObj.getLocationId() == null)
                    return null;
                else {
                    // processedData.add(processedObj);
                    return processedObj;
                }
            }

            @Override
            public void open(ExecutionContext executionContext) throws ItemStreamException {
                // TODO Auto-generated method stub
                //list=transactionHistoryRepository.findAll();
            }
            @Override
            public void update(ExecutionContext executionContext) throws ItemStreamException {
                // TODO Auto-generated method stub  
            }
            @Override
            public void close() throws ItemStreamException {
                // TODO Auto-generated method stub
                count=1;    
            }
        }
    //============================================//
    @Bean
        public Step transactionHistoryStep() {
            return  ((SimpleStepBuilder<TransactionHistory, TransactionHistory>) stepBuilderFactory.get("transactionHistoryStep")
                    .<TransactionHistory,TransactionHistory>chunk(10)
                    .reader(reader())
                    .processor(processor())
                    .writer(writer())
                    .stream(new TransactionHistoryCsvItemProcessor()))
                    .faultTolerant()
                    .skipPolicy(transactionHistoryCsvImportSkipPolicy)
                    .build();

        }


        @Bean
        @JobScope
        public FlatFileItemReader<TransactionHistory> reader() {
            FlatFileItemReader<TransactionHistory> flatFileItemReader= new FlatFileItemReader<TransactionHistory>();
            try {

                TransactionHistoryFieldSetMapper transactionHistoryFieldSetMapper= new TransactionHistoryFieldSetMapper();

                flatFileItemReader.setResource(new FileSystemResource(FileResources.mappingFileResouces("transactionHistoryImportCsvFile")));
                flatFileItemReader.setName("CSV-Reader");
                flatFileItemReader.setLinesToSkip(1);
                flatFileItemReader.setLineMapper(new DefaultLineMapper<TransactionHistory>(){{
                    setLineTokenizer(new DelimitedLineTokenizer() {{
                        setNames("productId","locationId","periodId","quantity");
                        setFieldSetMapper(transactionHistoryFieldSetMapper);

                    }});
                    setFieldSetMapper(new TransactionHistoryFieldSetMapper(){{
                        //setTargetType(TransactionHistory.class);

                    }});
                }});
            }
            catch(Exception e) {
                e.printStackTrace();
                logger.error("read error"+flatFileItemReader);
            }

            return flatFileItemReader;
        }


         @Bean
         public ItemProcessor<TransactionHistory, TransactionHistory> processor() {
               return new TransactionHistoryCsvItemProcessor();
            }

//===========error ====//

启动 ApplicationContext 时出错。要显示条件报告,请在启用“调试”的情况下重新运行您的应用程序。 2020-May-05 22:30:13.654 错误 [main] o.s.b.SpringApplication - 应用程序运行失败 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“transactionHistoryController”的bean时出错:通过字段“transactionHistoryCsvImportJob”表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“transactionHistoryJob”的 bean 创建错误:通过工厂方法实例化 bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.core.Job]:工厂方法“transactionHistoryJob”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“transactionHistoryStep”的 bean 创建错误:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.core.Step]:工厂方法“transactionHistoryStep”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“处理器”的 bean 创建错误:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.item.ItemProcessor]:工厂方法“处理器”抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743) 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:312) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1214) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1203) 在 com.datalabsindia.ScpApplication.main(ScpApplication.java:21) 原因:org.springframework.beans.factory.BeanCreationException:在类路径资源[com/datalabsindia/batch/TransactionHistoryCsvImport.class]中定义名称为“transactionHistoryJob”的bean创建错误:通过工厂方法实例化bean失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.core.Job]:工厂方法“transactionHistoryJob”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“transactionHistoryStep”的 bean 创建错误:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.core.Step]:工厂方法“transactionHistoryStep”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“处理器”的 bean 创建错误:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.item.ItemProcessor]:工厂方法“处理器”抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ...省略了19个常用框架 原因:org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.batch.core.Job]:工厂方法'transactionHistoryJob'抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“transactionHistoryStep”的 bean 创建错误:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.core.Step]:工厂方法“transactionHistoryStep”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“处理器”的 bean 创建错误:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.item.ItemProcessor]:工厂方法“处理器”抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ...省略了32个常用框架 原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“transactionHistoryStep”的 bean 创建错误:通过工厂方法实例化 bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.core.Step]:工厂方法“transactionHistoryStep”抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“处理器”的 bean 创建错误:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.item.ItemProcessor]:工厂方法“处理器”抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference(ConfigurationClassEnhancer.java:394) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:366) 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6.transactionHistoryStep() 在 com.datalabsindia.batch.TransactionHistoryCsvImport.transactionHistoryJob(TransactionHistoryCsvImport.java:97) 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6.CGLIB$transactionHistoryJob$3() 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6$$FastClassBySpringCGLIB$$d1625b5b.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6.transactionHistoryJob() 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ...省略了33个常用框架 引起:org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.batch.core.Step]:工厂方法'transactionHistoryStep'抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“处理器”的 bean 创建错误:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.item.ItemProcessor]:工厂方法“处理器”抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ...省略了56个常用框架 原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [com/datalabsindia/batch/TransactionHistoryCsvImport.class] 中定义名称为“处理器”的 bean 创建错误:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.item.ItemProcessor]:工厂方法“处理器”抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference(ConfigurationClassEnhancer.java:394) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:366) 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6.processor() 在 com.datalabsindia.batch.TransactionHistoryCsvImport.transactionHistoryStep(TransactionHistoryCsvImport.java:105) 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6.CGLIB$transactionHistoryStep$4() 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6$$FastClassBySpringCGLIB$$d1625b5b.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6.transactionHistoryStep() 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ...省略了57个常用框架 引起:org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.batch.item.ItemProcessor]:工厂方法'处理器'抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ...省略80个常用框架 引起:java.lang.NullPointerException:null 在 com.datalabsindia.batch.TransactionHistoryCsvItemProcessor.(TransactionHistoryCsvItemProcessor.java:55) 在 com.datalabsindia.batch.TransactionHistoryCsvImport.processor(TransactionHistoryCsvImport.java:160) 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6.CGLIB$processor$2() 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6$$FastClassBySpringCGLIB$$d1625b5b.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) 在 com.datalabsindia.batch.TransactionHistoryCsvImport$$EnhancerBySpringCGLIB$$669179a6.processor() 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ...省略了81个常用框架

【问题讨论】:

  • 如果我将存储库查询放入进程方法中,它工作正常。但我不想那样做
  • 欢迎使用 stackoverflow。参观并获得第一个徽章 - stackoverflow.com/tour

标签: spring-boot spring-batch itemprocessor


【解决方案1】:

您遇到的异常是由于您尝试使用 @Autowired 依赖项,然后您才能保证该依赖项已注入您的 TransactionHistoryCsvItemProcessor 对象。

工厂方法“处理器”抛出异常;嵌套异常是 java.lang.NullPointerException 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)

这些是有问题的行:

List<TransactionHistory>list= transactionHistoryRepository.findAll();
List<String> pLevel7Products = productHierarchyRepository.getPLevel7Ids();
List<String> level5locations=locationHierarchyRepository.getLevel5Ids();

如果您需要对您的TransactionHistoryCsvItemProcessor 对象进行一些额外的初始化,最简单的做法是让TransactionHistoryCsvItemProcessor 实现InitializingBean,然后在覆盖的方法afterPropertiesSet 中初始化您的Lists。

对于example

public class TransactionHistoryCsvItemProcessor 
    implements InitializingBean, ItemStream, ItemProcessor<TransactionHistory,TransactionHistory>{

    @Autowired
    private TransactionHistoryRepository transactionHistoryRepository;
    @Autowired
    private ProductHierarchyRepository productHierarchyRepository;
    @Autowired
    private LocationHierarchyRepository locationHierarchyRepository;

    List<TransactionHistory> list;
    List<String> pLevel7Products;
    List<String> level5locations;

    // ...implementation omitted for brevity

    @Override
    public void afterPropertiesSet() throws Exception {
        // typical null checks would also be prudent
        list = transactionHistoryRepository.findAll();
        pLevel7Products = productHierarchyRepository.getPLevel7Ids();
        level5locations = locationHierarchyRepository.getLevel5Ids();
    }

}

【讨论】:

  • 感谢 philip 的回答,我尝试使用 @PostConstruct 但它仅在应用程序启动后调用一次,如果我更改数据库中的数据,则存储库将不会获取修改后的数据。是否 public void afterPropertiesSet()当我们调用弹簧批处理或任何特定端点时,只调用一次或每次。如果我写的英语不好,请见谅
  • afterPropertiesSet() 也只被调用一次。如果您需要不断地从数据库中提取新数据,那么我建议将这些存储库方法调用放在您的 process() 方法中。
  • 但是如果我将存储库 findAll 查询放在进程中,对于每个项目,我不想获取所有数据,因为数据量很大。任何选择......
  • 我明白了。这绝对是个问题。我已经在我自己的工作中成功使用了Driving Query Pattern,其中数据量太大而无法使用规范的ItemReader&lt;T&gt; 方法处理。
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
相关资源
最近更新 更多