java - 在作业 ETL-Load 中执行步骤 ETL-file-load 时遇到错误

标签 java spring spring-boot spring-mvc spring-batch

我在 Heroku 服务器上收到此错误,但它在本地完全正常工作。

这是从表单获取 CSV 文件并尝试存储在资源文件夹中的 Controller 。

@PostMapping(value = "/import-csv")
    public ModelAndView uploadCSV(HttpServletRequest request, HttpServletResponse response, @RequestParam("file") MultipartFile multipartFile) throws IOException, JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
        logger.info("Entering into import-csv controller");
        int id = Integer.parseInt(request.getParameter("listId"));
        try {
            String listId = request.getParameter("listId");
            logger.info("id is : {}",id);
            String path = new ClassPathResource("tempUpload/").getURL().getPath();
            logger.info("path : {}",path);
            File fileToImport = new File(path + multipartFile.getOriginalFilename());
            logger.info("full path : {}", fileToImport.toString());

            System.out.println("iside cotmt:" + "file:" + fileToImport.getAbsolutePath());


            Map<String, JobParameter> maps = new HashMap<>();
            maps.put("time", new JobParameter(System.currentTimeMillis()));
            maps.put("fullPathFileName", new JobParameter(fileToImport.getAbsolutePath()));
            maps.put("listId", new JobParameter(listId));
            JobParameters parameters = new JobParameters(maps);
            JobExecution jobExecution = jobLauncher.run(job, parameters);


            logger.info("JobExecution: {}" ,jobExecution.getStatus());

            logger.info("Batch is Running...");
            userService.setListofUserSave(listId);
            logger.info("Exiting from import-csv controller");


        } catch (Exception e) {
            logger.error("Error while uploading csv file");
            e.printStackTrace();
        }
        return new ModelAndView("redirect:/view?id=" + id);
    }

这是项目读取器,采用临时存储在资源文件夹中的 CSV 文件的路径。

    @Bean
    @Scope(value = "step", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public FlatFileItemReader<User> itemReader(@Value("#{jobParameters[fullPathFileName]}") String pathToFile) {
        logger.info("file path inside spring batch config: {}", pathToFile);
        FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
        flatFileItemReader.setResource(new FileSystemResource(pathToFile));
        flatFileItemReader.setName("CSV-Reader");
        flatFileItemReader.setLinesToSkip(1);
        flatFileItemReader.setLineMapper(
        new DefaultLineMapper<User>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[]{"name", "email"});
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {{
                setTargetType(User.class);
            }});
        }}) ;
        return flatFileItemReader;
    }

但它在日志中显示此错误:

Apr 02 04:11:31 demo-letter app/web.1 2020-04-02 11:11:30.802  INFO 4 --- [o-57213-exec-10] c.e.demo.Configration.SpringBatchConfig  : file path inside spring batch config: /app/file:/app/target/demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/tempUpload/csvtesting.csv
Apr 02 04:11:31 demo-letter app/web.1 2020-04-02 11:11:30.805 ERROR 4 --- [o-57213-exec-10] o.s.batch.core.step.AbstractStep         : Encountered an error executing step ETL-file-load in job ETL-Load
Apr 02 04:11:31 demo-letter app/web.1 
Apr 02 04:11:31 demo-letter app/web.1 org.springframework.batch.item.ItemStreamException: Failed to initialize the reader
Apr 02 04:11:31 demo-letter app/web.1   at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:153) ~[spring-batch-infrastructure-4.2.1.RELEASE.jar!/:4.2.1.RELEASE]
Apr 02 04:11:31 demo-letter app/web.1   at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader$$FastClassBySpringCGLIB$$ebb633d0.invoke(<generated>) ~[spring-batch-infrastructure-4.2.1.RELEASE.jar!/:4.2.1.RELEASE]
Apr 02 04:11:31 demo-letter app/web.1   at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
Apr 02 04:11:31 demo-letter app/web.1   at 

org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
.
.
.
Apr 02 04:11:31 demo-letter app/web.1   at java.lang.Thread.run(Thread.java:748) [na:1.8.0_242-heroku]
Apr 02 04:11:31 demo-letter app/web.1 Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): file [/app/file:/app/target/demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/tempUpload/csvtesting.csv]
Apr 02 04:11:31 demo-letter app/web.1   at org.springframework.batch.item.file.FlatFileItemReader.doOpen(FlatFileItemReader.java:257) ~[spring-batch-infrastructure-4.2.1.RELEASE.jar!/:4.2.1.RELEASE]
Apr 02 04:11:31 demo-letter app/web.1   at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:150) ~[spring-batch-infrastructure-4.2.1.RELEASE.jar!/:4.2.1.RELEASE]
Apr 02 04:11:31 demo-letter app/web.1   ... 84 common frames omitted

最佳答案

查看错误:

Apr 02 04:11:31 demo-letter app/web.1 Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): file [/app/file:/app/target/demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/tempUpload/csvtesting.csv

我相信您的资源是从类路径解析的,而不是在文件系统上。您的问题在这里:

String path = new ClassPathResource("tempUpload/").getURL().getPath();

应该是:

String path = new FileSystemResource("/absolute/path/to/tempUpload/").getURL().getPath();

关于java - 在作业 ETL-Load 中执行步骤 ETL-file-load 时遇到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60991827/

相关文章:

ubuntu - 无法在 Tomcat 7 和 Ubuntu 中部署 grails 3 war - 404 错误

java.lang.IllegalStateException : missing behavior definition for the preceding method call getMessage ("title")

spring - 如何解决Gradle服务之间的传递依赖关系?

spring-boot - 当我将它与 db2 一起用于分页时,我的下一页出现错误

java - Action 映射触发 Controller 中的错误方法

java - 客户端日期时间与服务器日期时间不匹配

java - 有关使用@PreAuthorize 时抛出 Access Denied 异常的方法的信息

JAVA:调整短信字符倒计时

java - org.apache.catalina.LifecycleException : Failed to start component [StandardEngine[Catalina]. StandardHost[本地主机].StandardContext[/mmasgis]]

java - 如何计算两个 vector 之间的角度?