Spring Boot中动态读取和持久化外部JSON文件教程

Spring Boot中动态读取和持久化外部JSON文件教程

本教程旨在解决spring boot应用在定时任务中读取持续更新的外部json文件时遇到的数据无法实时同步问题。文章将深入分析`class.getresourceasstream()`的局限性,并提供一套基于文件系统路径读取的解决方案,结合最佳实践(如构造器注入)和spring `@scheduled`注解,确保应用能高效、准确地将外部动态数据持久化到数据库。

Spring Boot中动态文件读取的挑战

在Spring Boot应用开发中,我们经常需要处理外部数据源,例如JSON文件。当这些文件位于项目的src/main/resources目录下,并且需要被应用周期性地读取和更新数据库时,可能会遇到一个常见问题:即使外部JSON文件内容已经更新,应用通过@Scheduled任务读取到的数据仍然是旧的。

这背后的主要原因是src/main/resources目录下的文件在应用打包(如JAR或WAR)后,会被视为类路径资源。当使用Class.getResourceAsStream()方法获取这些文件的输入流时,JVM或类加载器通常会从打包好的文件中读取,并且可能对这些资源进行缓存。这意味着,即使你在文件系统外部修改了src/main/resources目录下的源文件,运行中的Spring Boot应用通过getResourceAsStream获取的仍然是打包时或首次加载时的旧版本内容,无法反映实时的外部修改。

因此,对于需要持续更新且实时读取的文件,将其作为类路径资源处理是不合适的。我们应该将其视为外部文件,通过文件系统路径直接访问。

解决方案:访问外部文件而非类路径资源

要解决上述问题,核心在于改变文件读取策略:不再将动态更新的JSON文件视为类路径资源,而是将其作为普通的文件系统文件进行访问。

将JSON文件放置在应用外部可访问的路径:例如,与JAR包同级的某个目录下,或者一个明确的配置路径。通过文件系统路径直接读取:使用java.nio.file.Path和java.nio.file.Files或者java.io.File和java.io.FileInputStream来获取文件的输入流。

示例代码重构

我们将对原有的Spring Boot应用进行改造,以实现动态JSON文件的实时读取和数据库持久化。

1. 配置外部文件路径

首先,在application.properties或application.yml中定义外部JSON文件的路径。

音疯 音疯

音疯是昆仑万维推出的一个AI音乐创作平台,每日可以免费生成6首歌曲。

音疯 146 查看详情 音疯

application.properties

json.file.path=/path/to/your/external/json/file.json# 例如:json.file.path=./data/file.json (相对于应用启动目录)# 或:json.file.path=/opt/app/data/file.json (绝对路径)

请根据实际情况替换/path/to/your/external/json/file.json。

2. Master模型类(不变)

// package com.example.demo.model;// import lombok.Data;// @Data// public class Master {//    // ... 你的Master实体字段//    private Long id;//    private String name;//    // ...// }

3. MasterRepository接口(不变)

package com.example.demo.Repository;import com.example.demo.model.Master;import org.springframework.data.repository.CrudRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface MasterRepository extends CrudRepository {}

4. MasterService服务类(优化依赖注入)

为了遵循Spring的最佳实践,我们将@Autowired字段注入改为构造器注入。这使得依赖关系更清晰,便于测试,并确保所有必需的依赖在对象构造时就已提供。

package com.example.demo.Services;import com.example.demo.Repository.MasterRepository;import com.example.demo.model.Master;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional; // 导入事务注解import java.util.List;@Servicepublic class MasterService {    private final MasterRepository masterRepository; // 使用final修饰,强调不可变性    // 构造器注入    public MasterService(MasterRepository masterRepository) {        this.masterRepository = masterRepository;    }    public Iterable list() {        return masterRepository.findAll();    }    @Transactional // 确保保存操作在事务中执行    public Master save(Master master) {        return masterRepository.save(master);    }    @Transactional // 确保批量保存操作在事务中执行    public Iterable save(List masters) {        return masterRepository.saveAll(masters);    }}

5. 主应用类(重构文件读取逻辑)

在主应用类中,我们将注入配置的JSON文件路径,并在@Scheduled方法中通过Path和Files来读取文件。

package com.example.demo;import com.example.demo.Services.MasterService;import com.example.demo.model.Master;import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.ObjectMapper;import lombok.Data;import org.springframework.beans.factory.annotation.Value; // 导入Value注解import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.transaction.annotation.EnableTransactionManagement;import java.io.IOException;import java.io.InputStream;import java.nio.file.Files; // 导入Files工具类import java.nio.file.Path; // 导入Path类import java.nio.file.Paths; // 导入Paths工具类import java.util.List;// 假设MasterList不再需要,直接读取List// @Data// class MasterList {//    List masterList;// }@SpringBootApplication@EnableScheduling // 启用定时任务@EnableTransactionManagement // 启用事务管理public class ReadAndWriteJsonApplication {    private final MasterService masterService; // 使用final修饰    @Value("${json.file.path}") // 注入配置文件中的JSON文件路径    private String jsonFilePath;    // 构造器注入MasterService    public ReadAndWriteJsonApplication(MasterService masterService) {        this.masterService = masterService;    }    public static void main(String[] args) {        SpringApplication.run(ReadAndWriteJsonApplication.class, args);        // 移除TimerTaskUtil的调用,因为我们使用Spring的@Scheduled    }    @Scheduled(fixedRate = 90000) // 每90秒执行一次    public void readFileAndSaveToDatabase() {        ObjectMapper mapper = new ObjectMapper();        TypeReference<List> typeReference = new TypeReference<List>() {};        Path filePath = Paths.get(jsonFilePath); // 根据配置路径创建Path对象        try (InputStream inputStream = Files.newInputStream(filePath)) { // 使用Files.newInputStream获取实时文件流            List masters = mapper.readValue(inputStream, typeReference);            System.out.println("成功读取到数据: " + masters);            // 批量保存到数据库,Service层已添加@Transactional            masterService.save(masters);            System.out.println("数据已成功保存到数据库。");        } catch (IOException e) {            System.err.println("读取或保存JSON文件时发生错误: " + e.getMessage());            // 生产环境中应使用日志框架记录错误,如SLF4J + Logback        } catch (Exception e) {            System.err.println("处理数据时发生未知错误: " + e.getMessage());        }    }}

注意事项

文件路径的正确性:确保json.file.path配置的路径是正确的,并且Spring Boot应用拥有读取该路径下文件的权限。对于相对路径,它通常是相对于应用启动的目录。文件存在性检查:在生产环境中,最好在读取文件前添加文件存在性检查,以避免不必要的文件未找到异常。

Path filePath = Paths.get(jsonFilePath);if (!Files.exists(filePath) || !Files.isReadable(filePath)) {    System.err.println("JSON文件不存在或不可读: " + jsonFilePath);    return; // 提前退出}

事务管理:在MasterService的save和saveAll方法上添加@Transactional注解,确保数据库操作的原子性。如果在保存过程中发生错误,所有更改将回滚。错误处理和日志记录:在实际应用中,应使用专业的日志框架(如SLF4J配合Logback)来记录错误和信息,而不是简单的System.out.println或System.err.println。资源管理:使用Java 7的try-with-resources语句可以确保InputStream在操作完成后被正确关闭,避免资源泄露。文件写入与读取的同步:如果JSON文件是由同一个应用或另一个进程持续写入的,需要考虑写入和读取的同步问题。例如,写入方可以先写入一个临时文件,待写入完成后再原子性地替换原文件,以避免读取到不完整或损坏的文件。

总结

通过将动态更新的JSON文件视为外部文件,并使用java.nio.file包提供的API进行读取,我们成功解决了Spring Boot @Scheduled任务无法实时获取更新数据的问题。同时,结合构造器注入等Spring最佳实践,使得代码更加健壮、可维护。在处理这类场景时,理解类路径资源与文件系统文件的区别至关重要,这有助于避免常见的缓存问题,并确保应用能够高效、准确地处理实时变化的外部数据。

以上就是Spring Boot中动态读取和持久化外部JSON文件教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1092407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 10:16:56
下一篇 2025年12月2日 10:17:17

相关推荐

  • Tether再曝准备金问题 聪明人已转向这3个去中心化稳定币

    Tether(USDT)的准备金问题再次成为市场关注的焦点,引发了用户对其资产安全性的担忧。本文将首先解析Tether准备金背后存在的争议,随后将详细介绍三种备受关注的去中心化稳定币:DAI、FRAX和LUSD。通过对它们运行机制的讲解,为希望寻找更透明、更去中心化稳定币选择的用户提供一份参考和操作…

    2025年12月8日
    000
  • 稳定币为什么稳定?稳定币真的不会跌吗?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 稳定币的设计宗旨是维持其市场价值与某一相对稳定的资产(如美元、黄金等)挂钩。人们期待稳定币能够提供加密货币的便利性,同时规避其价格的剧烈波动性。这种稳定性对于交易、…

    2025年12月8日
    000
  • 虚拟货币成交平台TOP10排名

    在数字资产的世界里,虚拟货币成交平台扮演着至关重要的角色。它们不仅是连接全球用户的桥梁,更是整个市场运行的流动性中枢。这些平台汇集了来自世界各地的买家与卖家,通过精密的撮合引擎,实现了数字资产的高效流转。每一个平台的诞生与发展,都伴随着其独特的功能定位、技术架构与市场策略。有的平台以其全面的产品线吸…

    2025年12月8日 好文分享
    000
  • 2025虚拟货币种类大全! 比特币/以太坊之外这8种小众币种即将暴涨

    随着数字资产领域的不断发展,除了广为人知的比特币和以太坊,许多新兴项目也因其独特的技术和应用前景而受到关注。本文将介绍八种在当前市场中备受瞩目的虚拟资产,并非做出任何投资建议,而是阐述它们各自的技术特点和发展方向。同时,本文将提供一个分析框架,讲解如何从多个维度对这些项目进行评估,以帮助您学习和理解…

    2025年12月8日
    000
  • 虚拟货币稳定币排行榜 哪些才是币圈“避风港”

    本文将通过介绍几种主流的稳定币,并深入讲解如何从透明度、合规性等多个维度去评估一个稳定币的安全性,从而帮助您理解哪些稳定币在市场中被普遍认为是相对可靠的选择,以及学习如何自行判断其“避险”属性。 2025主流加密货币交易所官网注册地址推荐: 欧易OKX: Binance币安: Gateio芝麻开门:…

    2025年12月8日
    000
  • 比特币和以太坊哪个好?比特币以太坊区别在哪?

    比特币和以太坊是当前广受关注的两种基于区块链技术的数字资产。它们都依赖分布式账本记录交易,但其设计理念、技术特性以及主要应用场景存在显著的不同。 设计愿景与核心功能 1.  比特币诞生于一个旨在创建去中心化点对点电子现金系统的构想。其主要目标是作为一种独立于传统金融机构的价值储存手段和交换媒介。 2…

    2025年12月8日
    000
  • 币圈动荡如何避险?TOP3稳定币榜单曝光

    在加密货币市场剧烈波动的背景下,投资者寻求资产保值的需求日益凸显。本文旨在解答如何在动荡的币圈中进行有效避险,将详细介绍稳定币这一核心避险工具的概念,并通过分析当前市场公认度较高的选项,提供一份TOP3稳定币榜单。文章会讲解如何根据自身需求选择和运用这些稳定币,从而在不确定的市场环境中更好地管理风险…

    2025年12月8日
    000
  • 全球稳定币市值PK!谁才是熊市中的’黄金替代品

    本文将围绕全球主流稳定币展开探讨,分析在市场下行周期(熊市)中,哪种稳定币更具备“黄金替代品”的避险属性。我们将通过对比各稳定币的市值、背书机制、透明度以及综合网络上的普遍看法,来阐述如何判断和选择一个在熊市中相对稳健的价值储存工具,并对这个分析过程进行讲解。 2025主流加密货币交易所官网注册地址…

    2025年12月8日
    000
  • 币圈量化交易是什么?量化交易能赚钱吗?量化交易最直白讲解

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 币圈量化交易,用最简单的话来说,就是利用数学模型和计算机程序来进行加密货币交易的一种方法。它不像人工交易那样依赖交易者的直觉或情绪,而是基于历史数据和预设的规则,通…

    2025年12月8日
    000
  • 币圈主流稳定币大全 除了USDT,这些稳定币更适合长期持有

    在加密货币市场中,稳定币是连接法定货币与数字资产的重要桥梁。虽然USDT(Tether)占据了最大的市场份额,但其储备金的透明度问题一直备受关注。因此,对于寻求资产保值和长期持有的用户而言,了解并配置其他更具透明度和合规性的稳定币显得尤为重要。本文将为您详细介绍除USDT之外的三种主流稳定币:USD…

    2025年12月8日
    000
  • 币圈K线怎么看?K线有用吗?K线最快速入门

    币圈的k线图是一种重要的技术分析工具,它以图形化的方式呈现了特定时间段内资产的价格变动情况。理解k线是许多市场参与者入门技术分析的第一步。它浓缩了开盘价、收盘价、最高价和最低价这四个关键信息,通过不同颜色和形态的蜡烛体与影线来直观地展示价格的波动轨迹。掌握k线的解读方法,能够帮助观察市场情绪、判断价…

    2025年12月8日
    000
  • 2025稳定币投资指南 通胀时代,如何用PAXG黄金稳定币保值

    在持续的通胀环境下,传统货币的购买力面临缩水挑战,许多投资者开始寻求新的保值工具。本文将详细阐述一种备受关注的数字资产——PAXG黄金稳定币,旨在解答如何利用它来对冲通胀风险。文章将从PAXG的基本概念入手,讲解其与黄金挂钩的运作机制,并提供一个清晰的操作思路,帮助您了解如何将PAXG作为资产保值的…

    2025年12月8日
    000
  • 币圈套期保值是什么?币圈套期保值的类型最新汇总

    在波动剧烈的加密资产市场,如何有效管理风险、锁定收益是投资者面临的核心挑战。套期保值作为一种重要的风险管理策略,可以帮助投资者对冲价格下跌的风险,从而保护其资产价值。本文将详细解释币圈套期保值的概念,并汇总介绍几种主流的对冲类型及其操作方式。 什么是币圈套期保值? 币圈套期保值(Hedging),又…

    2025年12月8日
    000
  • 比特币暴涨原因是什么?比特币还会涨吗?

    近期比特币价格经历了一轮显著上涨,引起了全球市场的广泛关注。这种价格表现并非单一因素驱动,而是多种宏观、微观以及市场结构性力量共同作用的结果。理解这一现象需要审视一系列相关的市场动态与发展。 机构兴趣与合规化进程 1. 比特币现货交易型开放式指数基金(ETF)在美国市场的获批是一个具有里程碑意义的事…

    2025年12月8日
    000
  • 币圈K线图怎么看?技术分析有用吗?K线入门图解

    在币圈,k线图是一种极为常见的市场分析工具,它浓缩了特定时间段内的价格信息,为交易者提供了市场的直观视图。理解k线图的基本构成,是进行技术分析的起点。 每根K线通常代表一个交易周期,可以是分钟、小时、日、周甚至月。一根完整的K线包含了四个核心价格信息:开盘价、收盘价、最高价和最低价。这些信息共同绘制…

    2025年12月8日
    000
  • 从比特币到DeFi:一文看懂数字货币的财富密码

    本文将带您回顾数字货币从诞生到演进为复杂金融生态的全过程。文章将从比特币出发,讲解其作为开创者的核心价值,接着探索以太坊如何通过智能合约开启了可编程的区块链时代,最后深入到DeFi(去中心化金融)如何重塑金融服务。通过理解这一技术演进的脉络,我们将共同探寻标题中提及的“财富密码”,它并非投机秘诀,而…

    2025年12月8日
    000
  • 币圈智能合约怎么赚钱?智能合约平台有哪些?

    智能合约不仅是区块链上自动执行的协议,更开启了多样化的数字资产互动和增收模式。本文将详细解析几种通过智能合约获取收益的主流方式,并介绍当前领先的几个智能合约平台,帮助你更好地理解这个充满机遇的领域。 智能合约主流交易所官网 币安Binance:  ()欧易OKX:  () Huobi火币:   ()…

    2025年12月8日
    000
  • 元宇宙经济爆发前夜:这7种虚拟货币潜力巨大

    本文将围绕元宇宙经济进行探讨,阐述元宇宙的基本概念,并通过介绍几种与元宇宙生态紧密相关的代表性%ignore_a_2%,来解析标题中所提到的“巨大潜力”是如何体现的。文章会讲解这些项目如何支撑起元宇宙的经济活动,为读者理解这一新兴领域提供一个清晰的框架。 2025主流加密货币交易所官网注册地址推荐:…

    2025年12月8日
    000
  • 虚拟货币是骗局还是未来

    关于虚拟货币究竟是骗局还是未来的争论从未停止。本文将不直接给出定论,而是通过深入剖析支撑“骗局论”与“未来论”双方的核心论点,为您揭示虚拟货币复杂的双面性。我们将探讨其作为投机工具的高风险性,以及其底层技术——区块链所蕴含的革命性潜力,帮助您更全面、客观地理解这一现象。 2025主流加密货币交易所官…

    2025年12月8日
    000
  • 什么是稳定币?类型、优点和风险详细说明

    稳定币,顾名思义,是价值相对稳定的数字资产,旨在解决传统加密货币波动性大的问题。它们通常与某种法币(如美元)、商品(如黄金)或另一种加密货币挂钩,以维持其价格的稳定性。这使得稳定币在数字交易、跨境支付和去中心化金融(defi)应用中扮演着日益重要的角色,为用户提供了更可靠的价值储存和交换媒介。它们的…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信