【问题标题】:How do I make json file in src/main/resources/ accessable when spring application is hosted in a docker container?当 spring 应用程序托管在 docker 容器中时,如何使 src/main/resources/ 中的 json 文件可访问?
【发布时间】:2021-05-28 09:38:46
【问题描述】:

我正在尝试读取位于 src/main/resources 下的 json 文件,这在本地工作得很好,但是在构建 docker-image 后,相同的代码在部署时报告“IOException - File not found”。

这是试图加载到类中的代码:

@Component
public class KontorAdmin {
    List<KontorInfo> kontorer;

    String filePath = "./src/main/resources/kontortoggle.json";

    public KontorAdmin() throws IOException {
        initKontor();
    }
    
    public void initKontor() throws IOException {
        File file = new File(filePath);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        KontorWrapper kontorWrapper = objectMapper.readValue(file, KontorWrapper.class);
        this.kontorer = kontorWrapper.getKontorer();
    }

这里是 dockerfile:

FROM openjdk:11
VOLUME /tmp

ADD target/rek-service.jar rek-service.jar
EXPOSE 80:80

ENTRYPOINT ["java","-jar","rek-service.jar"]

我想我可以将文件添加到 docker,但是我如何让它在本地通过单元测试,这需要不同的文件路径?

感谢您的帮助

【问题讨论】:

    标签: java spring-boot docker filenotfoundexception


    【解决方案1】:

    实际上,资源文件在你的类路径中。

    你应该尝试这样阅读,

    File file = ResourceUtils.getFile("classpath:kontortoggle.json");
    

    File file = new File(getClass().getResource("kontortoggle.json").getFile());
          
    

    【讨论】:

      【解决方案2】:

      您的问题是您的文件访问权限。构建 jar 时,您的 json 文件将作为 jar 文件的一部分移动。因此,您永远不会通过简单的文件访问名称找到该文件。您的资源 json 文件是 rek-service.jar 文件的一部分。您有多个机会访问此文件。

      在您的用例中,您使用的是 fasterxml 对象映射器。这可以与文件或流一起使用。我建议通过此代码使用流:

      @Component
      public class KontorAdmin {
          List<KontorInfo> kontorer;
      
      
          public KontorAdmin() throws IOException {
              initKontor();
          }
          
          public void initKontor() throws IOException {
               InputStream is = getClass().getResourceAsStream("kontortoggle.json");
      
              ObjectMapper objectMapper = new ObjectMapper();
              objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
              KontorWrapper kontorWrapper = objectMapper.readValue(is, KontorWrapper.class);
              this.kontorer = kontorWrapper.getKontorer();
          }
      

      但是通过@Component 注释我怀疑你正在使用spring。使用 Spring,从类路径中获取 InputStream 或 File 要容易得多。然后你应该看看 ClassPathResource 或 ResourceUtils。 ResourceUtils 似乎是供 JavaDoc 内部使用的,但任何人都在 Spring 中使用它们。

      new ClassPathResource("data/employees.dat", this.getClass().getClassLoader());

      ResourceUtils.getFile("classpath:kontortoggle.json");

      @Component
      public class KontorAdmin {
          List<KontorInfo> kontorer;
      
      
          public KontorAdmin() throws IOException {
              initKontor();
          }
          
          public void initKontor() throws IOException {
              
      
              ObjectMapper objectMapper = new ObjectMapper();
              objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
              KontorWrapper kontorWrapper = objectMapper.readValue(ResourceUtils.getFile("classpath:kontortoggle.json"), KontorWrapper.class);
              this.kontorer = kontorWrapper.getKontorer();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-03
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 2014-11-21
        • 2019-03-09
        • 1970-01-01
        • 2016-03-06
        相关资源
        最近更新 更多