最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何利用 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)与资源动态同步。