[英]How to manage writing to file correctly using Spring Boot Rest Java EE project?
我正在尝试更新服务器资源文件夹中的JSON文件,以响应将表单提交到我的api端点。
我想从控制器QueryMapController.java更新我的QueryMap.json
@CrossOrigin
@RequestMapping("/newQuery")
public String newQuery(@RequestParam("qid") String qid, @RequestParam("query") String query) throws Exception{
String fileName="QueryMap.json";
File file = new ClassPathResource(fileName).getFile();
JSONParser parser = new JSONParser();
FileReader fr = new FileReader(file);
Object ob = parser.parse(fr);
fr.close();
JSONArray arr = (JSONArray)ob;
JSONObject newob = new JSONObject();
newob.put("Query_id",qid);
newob.put("Query",query);
arr.add(newob);
FileWriter fw = new FileWriter(file.getAbsoluteFile(),false);
BufferedWriter out = new BufferedWriter(fw);
out.write(arr.toJSONString());
out.flush();
out.close();
fw.close();
return arr.toJSONString();
}
上面的代码是我想用来更新.json文件的Controller方法。 显然,一切似乎正常。 它可以正常工作,并且程序执行时就像文件已更新,但实际文件未更改一样。 当我重新启动服务器时,更改已消失。 似乎文件在运行时内部缓存在某个地方。 我该如何处理。
请原谅我的自定义数据连接并编写类似这样的代码,但这些代码并不严格遵循MVC准则。 用这种方式进行编码有其背后的原因。
tl; dr将要修改的文件放在类路径之外,因为在构建/打包项目时,这些文件会被<projectDir>/src/main/resources
目录中的文件覆盖。 如果您想查看此代码,请查看答案的结尾。
发生这种情况的原因很可能是因为重新启动服务器时,将重新构建项目。 在此过程中,将重新编译每个类,并将所有资源(使用maven时, <projectDir>/target/classes/
)连同所有资源一起放置在单独的目录中。 这将用<projectDir>/src/main/resources
目录中的原始文件替换更改后的json文件版本。
您可以通过调试newQuery
方法并按照以下步骤进行验证:
File.getAbsolutePath()
检查json文件的位置。 对我来说,它是<projectDir>/target/classes/QueryMap.json
。 mvn clean package
)。 <projectDir>/target/classes/QueryMap.json
替换为<projectDir>/src/main/resources/QueryMap.json
。 一种解决方案是将您的类路径上的json文件用作默认文件,并将其复制到当前工作目录中,您可以在其中以任何所需的方式对其进行更改:
File editableQueryMap = new File("./QueryMap.json");
if (!editableQueryMap.exists()) {
File defaultQueryMap = new ClassPathResource("QueryMap.json").getFile();
try (OutputStream os = Files.newOutputStream(editableQueryMap.toPath())) {
Files.copy(defaultQueryMap.toPath(), os);
}
}
//do your changes with editableQueryMap here
对我来说,这会将可编辑的QueryMap.json
文件放在我的项目目录的根目录中。 如果使用jar文件,则应将文件放置在与jar相同的目录中(除非更改了工作目录)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.