【问题标题】:Spring boot: CsvReader class not reading filename from application.properties correctlySpring boot:CsvReader 类未正确从 application.properties 读取文件名
【发布时间】:2021-02-14 03:23:16
【问题描述】:

晚上好,优秀的程序员, 我是 Spring Boot 新手,在以下设置中看不到我做错了什么。

application.properties 有 io.input_file = "C:\Projects\validation\validation_input.csv"

ApplicationController.java 将 io.input_file 读入 inputFilename 字段并正确输出。 我看到 /parameters 网页上显示的文件名正确

ValidationApplication.java 的 main() 调用 List inputRows = new CsvReader().read(); OpenCSV 读取器和写入器正确查找和处理 CSV 文件内容。

我的问题是 CsvReader.java 有 C:\Projects\validation\validation_input.csv 文件名硬编码。 我想用 ValidationController.inputFilename 替换硬编码的文件名 它始终为空!

我不理解或遗漏了什么? 先感谢您, 电子人

application.properties 文件:

endpoint.url = "http://192.168.7.180:7150/api/latest/ngene/search"
io.input_file = "C:\\Projects\\validation\\validation_input.csv"  
io.output_file = "C:\\Projects\\validation\\validation_output.csv"
io.output_file_stats = "C:\\Projects\\validation\\validation_outputStats.csv" 



// ValidationController.java
@RestController
public class ValidationController {
    // Inject parameters from application.properties or application.yml: default if N/A
    @Value("${endpoint.url: Endpoint URL: TBD}")
    private String endpointURL;              // URL can be tracked outside on confluence page

    @Value("${io.input_file: input_file default path}")
    private String inputFilename;

    @GetMapping("/parameters")
    public String readParameters() {
        String output = "<b>Testing default localhost:8080/parameters</b>";
        output += "<p>End point URL = " + endpointURL + "</p>";
        output += "<p>Input file = " + inputFilename + "</p>";
        return output;
    }
}

// ValidationApplication.java:
@SpringBootApplication
public class ValidationApplication {

    public static void main(String[] args) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
        SpringApplication.run(ValidationApplication.class, args);

        // Lambda to print all
        System.out.println("\n\n\nLambda printing of CSV data read in:");
        List<InputData> inputRows = new CsvReader().read();
        inputRows.forEach(inputData -> System.out.println("\t" + inputData));

        List<OutputData> outputRows = new ArrayList<>();
        System.out.println("\n\n\nValidationApplication::main(): reading, validating, and writing of CSV data:");
        // Read each row, process, write out
        for (int i = 0; i<inputRows.size(); i++) {
            // Read row data
            InputData inputData = inputRows.get(i);
            System.out.println("\t" + i + ": " + inputData.toString());

            // Validate data
            System.out.println("\tValidate data here...");

            // Write row data
            String moreData = inputData.getData();
            OutputData outputData = new OutputData(moreData);
            System.out.println("\t" + i + ": " + outputData.toString() + "\n");
            outputRows.add(outputData);
        }

        // Test the manual CSV writer with headers
        CsvWriter csvWriter = new CsvWriter();

        // Test the bean CSV writer without headers
        csvWriter.write(outputRows);
    }
}



// CsvReader.java:
public class CsvReader {
    public List<InputData> read() throws FileNotFoundException {

        // Get input filename
        String inputFile = "C:\\Projects\\validation\\validation_input.csv";

        // Create the CSV reader
        FileReader fileReader = new FileReader(inputFile);

        CsvToBean<InputData> csvToBean = new CsvToBeanBuilder<InputData>(fileReader)
                .withType(InputData.class)
                .build();

        // Read/parse and close reader streams
        return csvToBean.parse();
    }
}

【问题讨论】:

  • 向我们展示如何将 ValidationController.inputFilename 提供给 CsvReader。
  • 我无法在 main() 中获取 ValidationController.inputFilename。当我得到它时,我会将它传递给构造函数,即 CsvReader(ValidationController.getInputFilename ())。挑战我的是事件的注释和顺序。

标签: java spring spring-boot properties controller


【解决方案1】:

您需要将 CSVReader 带入 spring。在这种情况下,您可以将 CSVReader 注释为组件,并将 inputFilename 注入其中,然后使用它。

或者,您可以通过构造函数将 inputFilename 传递给 CSVReader 并在那里使用它。

    public class CsvReader {
        String inputFile ;
        public CsvReader(String inputFile ){
            this.inputFile =inputFile ;
        }
    }

【讨论】:

  • 谢谢尼亚斯。我正在注释 CsvReader,并尝试进行字段注入,但失败了!我错过了什么? @Component public class CsvReader { @Value("${io.input_file: default input file}") private String inputFile; public CsvReader() { } public List read() throws FileNotFoundException { String inputFile = this.inputFile; // 为空 FileReader fileReader = new FileReader(inputFile); CsvToBean csvToBean = new CsvToBeanBuilder... return csvToBean.parse(); } }
  • 您是否在 ValidationController 中自动装配 CSVReader? spring 是否注入了 CSVReader 的对象?
  • 早上好,是的,尼亚斯。我错过了 1 或 2 个位置的 @Controller 注释。我添加了这些,在主文件中获取文件名,然后从那里设置它。我无法使用传递的文件名使构造函数工作,但话又说回来,这就是学习新爵士乐的乐趣。我也会弄清楚的。感谢您的意见、跟进和关心 :)。
【解决方案2】:

我在 1 或 2 个地方缺少 @Controller 注释。我添加了这些,在主目录中获取文件名,然后从那里设置。

我无法使用传递的文件名使构造函数工作,但话又说回来,这就是学习新爵士乐的乐趣。我也会想办法的。

感谢 A MIL 提供 Niyas 的意见,它为我指明了正确的目录以获得答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多