繁体   English   中英

使用控制器将 CSV 文件导入数据库以传递 CSV 文件

[英]Import CSV file into database using Controller to pass CSV file

我正在尝试在 Spring Batch 的帮助下创建用于将 csv 文件导入数据库的端点。 但我做不到。 有人可以帮我解决这个问题吗? 这将是非常感谢。 我是新来的学习者。 下面给出了我的源代码,请尝试帮助我解决这个问题。

@RestController
public class MyImportController {
    private static final Logger logger = LoggerFactory.getLogger(MyImportController.class);

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private Job importUserJob;

    @GetMapping(value = "/import/file")
    public String uploadFile() {
        return "/uploadFile";
    }


    @PostMapping(value="/import/file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String create(@RequestParam("file") MultipartFile multipartFile) throws IOException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {


        String paths = "/Users/dilipverma/Desktop/CSV_FILE_READER/src/main/resources/temp/";

        File fileToImport = new File(path + multipartFile.getOriginalFilename());

        System.out.println(" :::::::::::::::::::  File name is ::---------------------------"+fileToImport);
        OutputStream outputStream = new FileOutputStream(fileToImport);
        IOUtils.copy(multipartFile.getInputStream(), outputStream);
        outputStream.flush();
        outputStream.close();



        JobExecution jobExecution = jobLauncher.run(importUserJob, new JobParametersBuilder()
                .addString("fullPathFileName", fileToImport.getAbsolutePath())
                .toJobParameters());

        logger.info(" :::::::::::::::::::::: Job Status is :::::::::::::::::: "+jobExecution.getStatus());


        return "Done";
    }
} 

以上是我接受 CSV 文件的控制器。

//Batch File

@Configuration
    @EnableBatchProcessing
    public class BatchConfig {

        @Bean
        public ResourcelessTransactionManager batchTransactionManager(){

            return new ResourcelessTransactionManager();
        }

        @Bean
        protected JobRepository jobRepository(ResourcelessTransactionManager batchTransactionManager) throws Exception{
            MapJobRepositoryFactoryBean jobRepository = new MapJobRepositoryFactoryBean();
            jobRepository.setTransactionManager(batchTransactionManager);
            return jobRepository.getObject();
        }

        @Bean
        public JobLauncher jobLauncher(JobRepository jobRepository){
            SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
            jobLauncher.setJobRepository(jobRepository);
            return jobLauncher;
        }
    }



    @Configuration
public class ImportJobConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;



    @Bean
    @Scope(value = "step", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public FlatFileItemReader<Contact> importReader(@Value("#{jobParameters[fullPathFileName]}") String pathToFile) {
        FlatFileItemReader<Contact> reader = new FlatFileItemReader<>();
        reader.setResource(new FileSystemResource(pathToFile));
        reader.setLineMapper(lineMapper());

        return reader;
    }

    @Bean
    public LineMapper<Contact> lineMapper() {

        DefaultLineMapper<Contact> defaultLineMapper = new DefaultLineMapper<>();
        DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
        lineTokenizer.setDelimiter(",");
        lineTokenizer.setStrict(false);
        lineTokenizer.setNames( new String[] {"email", "contactno"});

        BeanWrapperFieldSetMapper<Contact> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
        fieldSetMapper.setTargetType(Contact.class);

        defaultLineMapper.setFieldSetMapper(fieldSetMapper);
        defaultLineMapper.setLineTokenizer(lineTokenizer);

        return defaultLineMapper;

    }

    @Bean
    public APSUploadFileItemProcessor processor() {
        return new APSUploadFileItemProcessor();
    }
    @Bean
    public Job importUserJob(ItemReader<Contact> importReader,
                             ItemWriter<Contact> itemWriter) {

        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .flow(step1(importReader,itemWriter))
                .end()
                .build();
    }

    @Bean
    public Step step1(ItemReader<Contact> importReader,
                      ItemWriter<Contact> itemWriter) {

        return stepBuilderFactory.get("step1")
                .<Contact, Contact>chunk(10)
                .reader(importReader)
                .processor(processor())
                .writer(itemWriter)
                .build();
    }
}

  //Processor for Job.
    @Component
public class APSUploadFileItemProcessor implements ItemProcessor<Contact, Contact> {

    @Override
    public Contact process(Contact apsUploadFile){
        return apsUploadFile;
    }
}

  //Storing into database

@Component
public class DBWriter implements ItemWriter<Contact> {

    @Autowired
    private ContactRepository contactRepository;

    @Override
    public void write(List<? extends Contact> contacts) throws Exception {

        contactRepository.save(contacts);

    }
}

下面完成的是我在传递我的 Csv 文件时遇到的错误。

2020-01-20 15:18:50.859 ERROR 15841 --- [nio-8090-exec-2] o.s.batch.core.step.AbstractStep         : Encountered an error executing step step1 in job importUserJob

org.springframework.beans.NotReadablePropertyException: Invalid property 'Id' of bean class [java.util.Collections$UnmodifiableRandomAccessList]: Could not find field for property during fallback access!
    at org.springframework.data.util.DirectFieldAccessFallbackBeanWrapper.getPropertyValue(DirectFieldAccessFallbackBeanWrapper.java:58) ~[spring-data-commons-2.1.10.RELEASE.jar:2.1.10.RELEASE]
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.getId(JpaMetamodelEntityInformation.java:152) ~[spring-data-jpa-2.1.10.RELEASE.jar:2.1.10.RELEASE]
    at org.springframework.data.repository.core.support.AbstractEntityInformation.isNew(AbstractEntityInformation.java:42) ~[spring-data-commons-2.1.10.RELEASE.jar:2.1.10.RELEASE]
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.isNew(JpaMetamodelEntityInformation.java:231) ~[spring-data-jpa-2.1.10.RELEASE.jar:2.1.10.RELEASE]
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:534) ~[spring-data-jpa-2.1.10.RELEASE.jar:2.1.10.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:359) ~[spring-data-commons-2.1.10.RELEASE.jar:2.1.10.RELEASE]

解决此问题的一种方法是使用 contactRepository.saveAll(contacts) 保存联系人。

@Override
public void write(List<? extends Contact> contacts) throws Exception {

    personRepository.saveAll(contacts);

}

通过使用它,我得到了输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM