繁体   English   中英

如何使用Spring Boot Rest Java EE项目正确管理对文件的写入?

[英]How to manage writing to file correctly using Spring Boot Rest Java EE project?

我正在尝试更新服务器资源文件夹中的JSON文件,以响应将表单提交到我的api端点。

项目目录结构

我想从控制器QueryMapController.java更新我的QueryMap.json

这是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方法并按照以下步骤进行验证:

  1. 使用File.getAbsolutePath()检查json文件的位置。 对我来说,它是<projectDir>/target/classes/QueryMap.json
  2. 检查文件的内容,它应该处于原始状态。
  3. 让您的代码进行更改,然后重新检查文件内容。 更改应该在那里。
  4. 停止服务器并重新构建您的项目(使用maven mvn clean package )。
  5. 文件内容应再次处于其原始状态,因为构建过程将<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM