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 的输入,它指出我在正确的目录中得到答案。
各位程序员大家晚上好, 我是 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 的输入,它指出我在正确的目录中得到答案。