一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何利用 ResourceLoader 加载远程 GitHub 文件资源

时间:2026-06-18 08:26:46 编辑:袖梨 来源:一聚教程网

本文介绍如何绕过 classpath 限制,利用 spring 的 resourceloader 直接加载远程 github 仓库中的 json 文件,结合 github rest api 动态获取文件列表并下载原始内容。

本文介绍如何绕过 classpath 限制,利用 spring 的 resourceloader 直接加载远程 github 仓库中的 json 文件,结合 github rest api 动态获取文件列表并下载原始内容。

Spring 的 ResourceLoader 默认支持 classpath:、file:、http: 等协议前缀,其中 http:// 或 https:// 协议可直接加载远程资源——但前提是提供可公开访问的原始文件 URL(如 raw.githubusercontent.com),而非 GitHub 页面 URL(如 github.com/.../tree/...)。因此,关键在于:将 GitHub 仓库路径转换为 raw 内容 URL,并通过 GitHub API 列出目标目录下的所有 JSON 文件

以下是一个完整、可运行的示例,使用 @Bean CommandLineRunner 在应用启动时自动拉取 razorpay/ifsc-api/data/ 下所有 JSON 文件:

@Autowiredprivate ResourceLoader resourceLoader;@BeanCommandLineRunner loadRemoteBankData(ObjectMapper objectMapper) {    return args -> {        try {            // 1. 调用 GitHub REST API 获取 data/ 目录内容(需确保仓库公开)            String apiEndpoint = "https://api.github.com/repos/razorpay/ifsc-api/contents/data";            List<UrlObject> contents = objectMapper.readValue(                new URL(apiEndpoint),                new TypeReference<List<UrlObject>>() {}            );            // 2. 过滤 JSON 文件,并构建 raw.githubusercontent.com 下载链接            List<String> jsonUrls = contents.stream()                .filter(obj -> obj.name != null && obj.name.endsWith(".json"))                .map(obj -> "https://raw.githubusercontent.com/razorpay/ifsc-api/master/data/" + obj.name)                .collect(Collectors.toList());            System.out.println("Found " + jsonUrls.size() + " JSON files: " + jsonUrls);            // 3. 使用 ResourceLoader 加载每个远程资源            for (String url : jsonUrls) {                try (InputStream is = readFile(url)) {                    // 示例:反序列化为 Map 或自定义实体                    Map<String, Object> data = objectMapper.readValue(is, Map.class);                    System.out.println("Loaded " + url + ", keys: " + data.keySet());                }            }        } catch (Exception e) {            System.err.println("Failed to load remote resources: " + e.getMessage());            throw new RuntimeException(e);        }    };}private InputStream readFile(String location) throws IOException {    Resource resource = resourceLoader.getResource(location);    if (!resource.exists()) {        throw new FileNotFoundException("Remote resource not found: " + location);    }    return resource.getInputStream();}// 对应 GitHub API 返回的 JSON 结构(简化版)static class UrlObject {    @JsonProperty("name")    String name;    @JsonProperty("type")    String type; // 可选:用于进一步校验是否为 "file"}

关键要点说明

  • ✅ ResourceLoader 原生支持 https:// 协议,无需额外配置;
  • ✅ 必须使用 raw.githubusercontent.com 域名(非 github.com),否则返回 HTML 页面而非原始内容;
  • ✅ GitHub API 返回的是目录元信息(含文件名、SHA、下载 URL 等),需解析后拼接 raw URL;
  • ⚠️ 注意速率限制:未认证请求每小时最多 60 次,生产环境建议添加 GitHub Token(通过 Authorization: Bearer <token>)提升限额;
  • ⚠️ 错误处理不可省略:网络超时、404、JSON 解析失败等均需捕获并日志记录;
  • ? 扩展建议:可将逻辑封装为 RemoteResourceFetcher 工具类,支持缓存、ETag 校验或异步批量加载。

通过该方案,你彻底摆脱了手动复制资源到 src/main/resources 的维护负担,实现配置即代码(Configuration-as-Code)与资源动态同步。

热门栏目