
本文介绍如何绕过 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 文件:
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
@Autowired
private ResourceLoader resourceLoader;
@Bean
CommandLineRunner 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)与资源动态同步。

















