如何读取资源文件夹下的Json文件?

问题描述

在我的 SpringBoot 应用程序中,我必须在这个路径 src/main/resources/mock/fileName.json 读取一个 Json 文件。 我是这样做的

JsonReader jsonReaderStream = new JsonReader(new InputStreamReader(Objects.requireNonNull(ClassLoader.getSystemClassLoader().getResourceAsstream("./mock/fileName.json"))));

它在本地工作,但是当我在 Kubernetes 上部署我的 docker 文件并尝试读取我的 Json 文件时,我收到了 NullPointerException。 我使用 gradle 进行构建。我声明我是 gradle、docker 和 kubernetes 的初学者。

谁能向我解释为什么它可以在本地运行,而不能在 Kubernetes 上运行?

解决方法

看起来您正在尝试为方法 getResourceAsStream 提供文件路径,但它没有提供。 JavaDoc 不是很好,您必须将不同的文档拼凑在一起才能理解它,但这里有一些相关部分:

查找具有给定名称的资源。资源是一些数据(图像、音频、文本等),可以通过类代码以独立于代码位置的方式访问。 资源的名称是一个以“/”分隔的路径名,用于标识资源。

[...]

在上面,资源的包名是 从最后一个 '/' 之前的字符的子序列派生 在名称中,然后替换子序列中的每个“/”字符 和 '。'。派生包名称时忽略前导斜杠。 例如,为名为的资源派生的包名称 “a/b/c/foo.properties”是“a.b.c”。

因此,要在正在运行的系统的类路径上找到您的资源,请删除 ./ 部分,使其仅显示为:.getResourceAsStream("mock/fileName.json")

,

这里有两种可能。

  1. 未打包,未找到
  2. 已打包,未找到

进入 .jar 包,检查您的 mock/x.json 是否存在于 target\example.jar!\BOOT-INF\classes 中。

如果正在打包但未找到,请参阅this answer
new ClassPathResource("./mock/fileName.json") 然后使用 resource.getInputStream()


强烈建议你把这些静态json文件放在resources/static/下,这样你就可以直接把这些文件比如resources/static/mock/a.json,作为/mock/a.json的请求