【问题标题】:How to read a Json file under the resources folder?如何读取资源文件夹下的Json文件?
【发布时间】:2021-04-28 10:51:45
【问题描述】:

在我的 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 上无效?

【问题讨论】:

  • 你得到什么错误?文件是否存在于远程位置?

标签: docker gradle kubernetes resources jsonreader


【解决方案1】:

这里有两种可能。

  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

【讨论】:

    【解决方案2】:

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

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

    [...]

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 2018-04-05
      • 1970-01-01
      • 2015-09-01
      • 2018-11-02
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多