You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Micronaut如何读取文件夹下文件 部署K8S后失效怎么解决

问题根因

本地IntelliJ运行时默认工作目录为项目根目录,你使用的Paths.get("mocks/file.json")是基于当前工作目录的相对路径,所以能正常读取。项目打包部署到K8S后,Jar包默认不会包含项目根目录下的mocks文件夹,容器运行时的工作目录下也没有对应路径,因此抛出文件不存在的错误。

解决方案

方案1:类路径加载(推荐,适合无需动态修改mock文件的场景)

  • 调整文件路径:在src/main/resources目录下新建mocks文件夹,将file.json移入该目录,最终路径为src/main/resources/mocks/file.json,Micronaut构建时会自动将resources下的文件打入Jar包类路径。
  • 替换读取逻辑:不要使用文件系统API读取,改为通过类加载器读取类路径资源,参考代码如下:
@Controller("${endpoints.all.path}/v1/file")
public class MyController {
    private static final Logger LOG = LoggerFactory.getLogger(MyController.class);
    // 注入Micronaut托管的ObjectMapper,避免自定义实例和全局序列化配置不一致
    private final ObjectMapper objectMapper;

    public MyController(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Get
    public HttpResponse<List<FileModel>> getAll() {
        try (InputStream inputStream = getClass().getResourceAsStream("/mocks/file.json")) {
            if (inputStream == null) {
                LOG.error("类路径下未找到/mocks/file.json资源");
                return HttpResponse.serverError();
            }
            List<FileModel> fileList = objectMapper.readValue(inputStream, new TypeReference<List<FileModel>>() {});
            return HttpResponse.ok(fileList);
        } catch (IOException e) {
            LOG.error("mock文件读取解析失败: {}", e.getMessage(), e);
            return HttpResponse.serverError();
        }
    }
}

如果不想移动原文件位置,可在构建配置(build.gradle/pom.xml)中增加规则,将根目录下的mocks文件夹打包到类路径中,读取逻辑同上即可。

方案2:外部挂载(适合需要不重启修改mock内容的场景)

  • 构建时无需将mocks目录打入Jar包
  • K8S部署时通过ConfigMap或Volume将file.json挂载到容器指定路径,比如/data/mocks/file.json
  • 把文件路径配置化:在application.yml中增加配置项mock.file.path=/data/mocks/file.json,本地调试时可将该配置值改为项目根目录下的相对路径,代码中注入该配置后再通过文件API读取即可。

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:36:02