Spring Batch ItemReader @StepScope空指针异常

时间:2018-07-16 22:08:22

标签: spring spring-boot spring-batch

基于我正在阅读的内容以及其他一些类似的问题,通过将Spring Batch组件指定为StepScope意味着Spring Batch将使用spring容器为每个步骤执行实例化该组件的新实例。

在我的特殊情况下,我具有下面的配置的countryXmlFileToDatabaseStep()和下一步,即下载文件,删除现有文件夹并使用xml文件创建新文件夹。

使用当前的隐含代码,没有在@StepScope上使用ItemReader批注,一切正常,但这是不对的,因为我需要Spring容器来实例化{每个步骤执行的{1}}组件。这样,我可以从C:\ ProcessFolder中删除Xml文件,并在第一步中将其替换为新文件,然后转到下一步ItemReader。如果XML文件名将更改,我可以更改属性文件中的名称,Spring在下一次作业运行时应选择该名称。

目前,我正在获取NULL指针,不知道为什么。下面是我的Step配置,包括堆栈跟踪。

countryXmlFileToDatabaseStep()

堆栈跟踪:

    Configuration
    @PropertySource("classpath:application.properties")
    public class CountriesListJobConfiguration extends AbstractHarvestService {

        private static final String QUERY_INSERT_EOI_MASTER= "INSERT " +
                "INTO MASTER(ISTER, MVALUE, MCODE, PROFILEURL, TYPE) " +
                "VALUES (?, ?, ?, ?, ?)";

         @Value( "${path.folder.master.country}" )
         private String countryXmlP; 
         // This points to my drive C:\\ProcessFolder\\Country_20180715.xml

        @Bean
        @StepScope
        ItemReader<CountryName> countryNameItemReader() {
            StaxEventItemReader<CountryName> xmlFileReader = new StaxEventItemReader<>();
            xmlFileReader.setResource(new FileSystemResource(countryXmlP));
            xmlFileReader.setFragmentRootElementName("CountryName");

            Jaxb2Marshaller studentMarshaller = new Jaxb2Marshaller();
            studentMarshaller.setClassesToBeBound(CountryName.class);
            xmlFileReader.setUnmarshaller(studentMarshaller);
            return xmlFileReader;
        }

        @Bean
        ItemProcessor<CountryName, CountryName> countryNameItemProcessor() {
            return new CountryItemProcessor();
        }

        @Bean
        ItemWriter<CountryName> countryNameItemWriter(DataSource dataSource, NamedParameterJdbcTemplate jdbcTemplate) {
            JdbcBatchItemWriter<CountryName> databaseItemWriter = new JdbcBatchItemWriter<>();
            databaseItemWriter.setDataSource(dataSource);
            databaseItemWriter.setJdbcTemplate(jdbcTemplate);
            databaseItemWriter.setSql(QUERY_INSERT_EOI_MASTER);
            ItemPreparedStatementSetter<CountryName> studentPreparedStatementSetter = new CountryItemPreparedStatementSetter();
            databaseItemWriter.setItemPreparedStatementSetter(studentPreparedStatementSetter);

            return databaseItemWriter;
        }
        @Bean
        Step countryXmlFileToDatabaseStep() {
            return stepBuilderFactory.get("countryXmlFileToDatabaseStep")
                    .<CountryName, CountryName>chunk(10)
                    .reader(countryNameItemReader())
                    .processor(countryNameItemProcessor())
                    .writer(countryNameItemWriter(super.dataSource, super.namedParameterJdbcTemplate))
                    .build();
        }

        @Bean
        public Flow country() {
            FlowBuilder<Flow> flowBuilder = new FlowBuilder<>("country");
            flowBuilder.start(countryXmlFileToDatabaseStep())
                    .end();
            return flowBuilder.build();
        }

0 个答案:

没有答案