StreamCorruptedException 仅在 Spring Boot 应用程序中读取资源文件

问题描述 投票:0回答:1

在 Spring Boot 应用程序 (2.3.3) 上,我依赖于我公司开发的模块。我从服务中调用此依赖项中的方法,该方法需要从资源加载文件 (

src/main/resources/META-INF/spring-main-cfg.xml
),因此我已将此文件复制并粘贴到我的 Spring Boot 应用程序资源中。

这是在该依赖项中执行的代码:

InputStream in = RSAEncrypter.class.getClassLoader().getResourceAsStream(keyFileName);
// StreamCorruptedException here
ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in));

堆栈:

java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:936) ~[na:1.8.0_281]
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:394) ~[na:1.8.0_281]

问题是,我创建了一个新的虚拟 Maven 项目,仅包含此依赖项和一个用于执行该代码的 main 项目,并且它可以工作。

我不明白我的 Spring Boot 应用程序执行此异常的原因是什么。我有相同的Java版本,读取的文件是相同的。

如何修复此问题以防止发生此异常?

java spring-boot maven stream
1个回答
1
投票

我终于找到了问题,这是文件本身,因为我有一个全局:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

Maven 文档对此表示:

警告:不要过滤具有图像等二进制内容的文件!这很可能会导致输出损坏。

https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

所以我刚刚为我的文件添加了一个例外:

<resources>
  <!-- Only properties files have to be filtered.
       META-INF/spring-main-cfg.xml must not be or StreamCorruptedException occure by reading it -->
  <resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
  </resource>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
      <include>**/*.properties</include>
    </includes>
  </resource>
</resources>
© www.soinside.com 2019 - 2024. All rights reserved.