Spring Boot Rest项目中正确管理文件写入:资源文件更新失效解决
问题根源与解决办法
嘿,我明白你遇到的问题了——看起来代码执行没报错,但实际文件没改,重启就复原,这是因为你操作的根本不是源码里的那个QueryMap.json文件!
为啥会这样?
Spring Boot运行时,src/main/resources下的文件会被复制到运行时类路径目录(开发环境是target/classes,生产环境是jar包内部)。你用ClassPathResource.getFile()拿到的是这个复制后的副本,不是源码目录里的原文件:
- 开发时,重启项目会重新生成
target目录,之前改的副本就被覆盖了; - 生产环境更糟,jar包是只读的,你根本没法修改里面的文件。
怎么解决?
给你两个实用方案,按需选择:
方案1:用外部文件路径(推荐,通吃开发和生产)
把需要修改的文件移出resources目录,放到项目外部的固定位置(比如项目根目录下新建个data文件夹,或者服务器的专属配置目录),直接操作真实的物理文件,彻底避开类路径的坑。
修改后的代码如下:
@CrossOrigin @RequestMapping("/newQuery") public String newQuery(@RequestParam("qid") String qid, @RequestParam("query") String query) throws Exception { // 用项目根目录+data文件夹作为存储路径,也可替换为服务器绝对路径 String filePath = System.getProperty("user.dir") + "/data/QueryMap.json"; File file = new File(filePath); // 确保目录和文件存在,避免找不到文件的异常 if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } if (!file.exists()) { file.createNewFile(); // 初始化空的JSON数组 try (FileWriter initWriter = new FileWriter(file)) { initWriter.write("[]"); } } JSONParser parser = new JSONParser(); try (FileReader fr = new FileReader(file)) { Object ob = parser.parse(fr); JSONArray arr = (JSONArray) ob; JSONObject newob = new JSONObject(); newob.put("Query_id", qid); newob.put("Query", query); arr.add(newob); try (FileWriter fw = new FileWriter(file, false); BufferedWriter out = new BufferedWriter(fw)) { out.write(arr.toJSONString()); out.flush(); } return arr.toJSONString(); } }
我还帮你换成了try-with-resources语法,能自动关闭流,比手动调用close()更安全可靠。
方案2:本地开发临时方案(仅调试用)
如果你只是本地开发时想修改源码里的文件,可以直接写死源码resources目录的路径:
String filePath = "src/main/resources/QueryMap.json"; File file = new File(filePath);
但这个方案仅限本地开发使用,生产环境绝对不能用——生产环境根本不存在src目录!
额外提醒
- 建议给文件操作添加更细致的异常处理,比如捕获文件不存在、权限不足等异常,返回友好的错误提示;
- 如果接口会被高并发调用,用文件存储数据的风险较高,建议换成数据库或者Redis来存储这些可变更的配置,并发安全性会更好。
内容的提问来源于stack exchange,提问作者Arpan Mukherjee
相关产品推荐
相关产品推荐

