Импортируйте файл CSV в базу данных, используя Controller для передачи файла CSV - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь создать конечную точку для импорта файла CSV в базу данных с помощью Spring Batch. Но я не в состоянии сделать. Может ли кто-нибудь помочь мне сделать с этим. Это будет здорово, благодарен. Я новый ученик. Мой исходный код приведен ниже, пожалуйста, попробуйте помочь мне разобраться в этой проблеме.

@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]

1 Ответ

0 голосов
/ 21 января 2020

Одним из способов решения этой проблемы является сохранение контактов с помощью contactRepository.saveAll (contacts).

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

    personRepository.saveAll(contacts);

}

При использовании этого я получил вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...