当前位置: 首页 > 知识库问答 >
问题:

使用spring batch和csv文件格式向db发送数据时获取空指针异常

商正浩
2023-03-14
  package com.batch.config;

import javax.sql.DataSource;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.LineMapper;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

import com.batch.model.User;

@Configuration
@EnableBatchProcessing
public class BatchConfig {
    @Autowired
    private DataSource dataSource;
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    @Autowired
    private StepBuilderFactory stepBuildFactory;

    @Bean
    public FlatFileItemReader<User> reader() {
        FlatFileItemReader<User> reader = new FlatFileItemReader<>();
        reader.setResource(new ClassPathResource("springbachdata.csv"));
        reader.setLineMapper(getlineMapper());
        reader.setLinesToSkip(1);
        return reader;
    }

    private LineMapper<User> getlineMapper() {
        DefaultLineMapper<User> lineMapper = new DefaultLineMapper<>();
        DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
        lineTokenizer.setNames(new String[] { "Emp ID", "Name Prefix", "First Name", "Last Name" });
        lineTokenizer.setIncludedFields(new int[] { 0, 1, 2, 4 });
        BeanWrapperFieldSetMapper<User> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
        fieldSetMapper.setTargetType(User.class);
        lineMapper.setLineTokenizer(lineTokenizer);
        lineMapper.setFieldSetMapper(fieldSetMapper);
        return lineMapper;
    }

    @Bean
    public UserItemProcessor processor() {
        return new UserItemProcessor();

    }

    public JdbcBatchItemWriter<User> writer() {
        JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<>();
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<User>());
        writer.setSql(
                "insert into user(userId,namePrefix,firstName,lastName) values (:userId, :namePrefix, :firstName, :lastName)");
        writer.setDataSource(this.dataSource);
        return writer;
    }
    @Bean
    public Job importUserJob() {
        return this.jobBuilderFactory.get("USER-IMPORT-JOB")
                .incrementer(new RunIdIncrementer())
                .flow(step1())
                .end()
                .build();
                
    }
@Bean
    public Step step1() {
return this.stepBuildFactory.get("step1")
.<User, User>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
    
    }
}

[2M2021-08-28 10:24:36.741[0;39M[32M信息[0;39M[35M10388[0;39M[2M----[0;39M[2M[main][0;39M[3M[2M:[0;39M步骤:[step1]在72ms内执行[0;39M[32M信息[0;39M[35M10388[0;39M[2M[2M----[0;39M[2M[2M[
main][0;39M[2M[2M[
main][0;39M[2M[2M[
main][0;39M[3]6mo.S.B.C.L.Support.SimpleJobLauncher[0;39m[2m:[0;39m job:[flowjob:[name=user-import-job]]完成,参数如下:[{run.id=4}],状态如下:[FAILED]in134ms'

块引号

共有1个答案

通飞尘
2023-03-14

请将LineMapper方法设为public并添加@bean注释。还要在JdbcBatchItemWriter方法上方添加@bean注释。

@Bean
public LineMapper<User> getlineMapper() {
        DefaultLineMapper<User> lineMapper = new DefaultLineMapper<>();
        DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
        lineTokenizer.setNames(new String[] { "Emp ID", "Name Prefix", "First Name", "Last Name" });
        lineTokenizer.setIncludedFields(new int[] { 0, 1, 2, 4 });
        BeanWrapperFieldSetMapper<User> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
        fieldSetMapper.setTargetType(User.class);
        lineMapper.setLineTokenizer(lineTokenizer);
        lineMapper.setFieldSetMapper(fieldSetMapper);
        return lineMapper;
    }

@Bean
public JdbcBatchItemWriter<User> writer() {
        JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<>();
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<User>());
        writer.setSql(
                "insert into user(userId,namePrefix,firstName,lastName) values (:userId, :namePrefix, :firstName, :lastName)");
        writer.setDataSource(this.dataSource);
        return writer;
    }
 类似资料:
  • zapier中的Javascript代码 在Action类中,我正在获取请求数据 正在获取异常 java.lang.NullPointerException\n\tat java.io.StringReader

  • 我知道为什么会出现错误:这是因为我想读取数据的表(Htest)为null。 我检查了我的excel,有一张正确名称为“htest”的表。 我还检查了工作簿中的工作表数。它返回工作簿的正确页数 我不知道为什么工作簿中的工作表是可用的,但代码返回null??我错过了什么?有人有同样的问题吗?或者你能给我一个提示来使用它吗? 谢谢你。 错误是:

  • 我试图存根这个方法:QueryUtils.to顺序(排序,根,构建器)和我正在做 但它进入queryUtils方法体,它会说Sort为null,并抛出一个NPE。但是,当它是存根时,为什么需要进入方法体?我以前没有遇到过这个问题,我认为它不应该关心该方法的内部逻辑是什么。

  • 我现在使用的是Itext PDFSmartCopy。我正在使用XMLWorker向document对象添加一些业务内容。然后我声明了一个阅读器(用于连接到此文档对象的pdf文件)。然后我用相同的文档对象和输出文件流作为参数调用PdfSmartCopy。然后使用常规步骤将页面复制到文档中, 但如果我使用一个新的文档对象ie而不添加业务内容,则这一块工作得很好。

  • 我有一个3节点星火集群。并尝试使用snowflake spark连接器和jdbc驱动程序访问snowflake jdbc:snowflake-jdbc-3.12.4.jar spark-connector:spark-snowflake_2.11-2.7.0-spark_2.4.jar 下面是我的代码: 我在sdf.show()上的调用失败,但有以下例外情况。有什么建议吗?

  • 每次运行代码(如下)时,我都会收到一个空指针错误,它指向用两个星号指定的行。 我是ApachePOI的新手,正在尝试将数据写入第二张excel表格(Sheet2)中的空白单元格。我做错什么了吗?