Spring引导:CsvReader类未正确读取application.properties中的文件名



晚上好,各位程序员,我是Spring Boot的新手,没有发现我在下面的设置中做错了什么。

application.properties具有io.input_file=";C: \项目\验证\验证输入.csv">

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

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

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

我不理解或错过了什么?提前感谢您,E-men

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("nnnLambda 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("nnnValidationApplication::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注释。我添加了这些,获得了主文件名,并从那里进行了设置。

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

感谢A MIL对Niyas的投入,它为我指明了正确的方向以获得答案。

最新更新