代码之家  ›  专栏  ›  技术社区  ›  Arpan Mukherjee

如何使用Spring Bug REST JAVA EE项目正确管理文件的写入?

  •  0
  • Arpan Mukherjee  · 技术社区  · 8 年前

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

    Project Directory Structure

    我想从控制器querymap controller.java更新querymap.json

    This is QueryMap.json file

         @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文件的控制器方法。 显然,一切似乎都正常。它工作时不会出错,程序执行时就像文件被更新了,但实际文件没有更改。当我重新启动服务器时,更改就消失了。在运行时,文件似乎是在内部缓存的。我该怎么办呢?

    请原谅我的自定义数据连接和编写不严格遵循MVC准则的代码。用这种方式编码是有原因的。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Yannik    8 年前

    DR 将要修改的文件放在类路径之外,因为它们将被类路径中的文件覆盖。 <projectDir>/src/main/resources 创建/打包项目时的目录。如果您想查看此代码,请检查答案的结尾。


    发生这种情况的原因很可能是因为重新启动服务器时,项目正在重新生成。在这个过程中,每个类都被重新编译,编译后的类和所有的资源都被放在一个单独的目录中。( <projectDir>/target/classes/ 使用maven时)。这会将更改后的JSON文件版本替换为 <项目目录>/src/main/resources 目录。

    您可以通过调试 newQuery 方法和以下步骤:

    1. 检查JSON文件的位置 File.getAbsolutePath() . 对我来说是 <projectDir>/target/classes/QueryMap.json .
    2. 检查文件的内容,它应该处于原始状态。
    3. 让代码进行更改,然后重新检查文件内容。应该有变化。
    4. 停止服务器并重新构建项目(使用maven mvn clean package )
    5. 文件内容应再次处于其原始状态,因为生成过程已替换 <项目目录/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相同的目录中(除非更改了工作目录)。