Как правильно записать в файл, используя проект Spring Boot Rest Java EE? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь обновить файл JSON в папке ресурсов моего сервера в ответ на отправку формы в мою конечную точку API.

Project Directory Structure

Я хочуобновить мой QueryMap.json из контроллера QueryMapController.java

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 Ответ

0 голосов
/ 01 июня 2018

tl; dr Поместите файлы, которые вы хотите изменить, за пределы вашего пути к классам, потому что они перезаписываются файлами в вашем каталоге <projectDir>/src/main/resources при сборке / упаковке вашего проекта.Если вы хотите увидеть код для этого, проверьте конец ответа.


Причина, по которой это происходит, наиболее вероятна, потому что при перезапуске сервера ваш проект перестраивается.Во время этого процесса каждый класс перекомпилируется, и скомпилированные классы помещаются в отдельный каталог вместе со всеми ресурсами (<projectDir>/target/classes/ при использовании maven).Это заменит вашу измененную версию json-файла оригинальной из вашего каталога <projectDir>/src/main/resources.

Это можно проверить, отладив метод newQuery и выполнив следующие действия:

  1. Проверьте местоположение вашего файла JSON с File.getAbsolutePath().Для меня это <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 (если только не изменен рабочий каталог).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...