Spring 启动:CsvReader class 没有从 application.properties 正确读取文件名

Spring boot: CsvReader class not reading filename from application.properties correctly

各位程序员大家晚上好, 我是 Spring 引导的新手,在下面的设置中没有看到我做错了什么。

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 reader 和 writer 正确找到并处理 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();
    }
}

您需要将 CSVReader 导入 spring。这种情况下,可以将CSVReader注解为组件,注入inputFilename,使用

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

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

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

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

感谢 A MIL Niyas 的输入,它指出我在正确的目录中得到答案。