SpringBoot:ServletContext资源无法解析S3 URL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot:ServletContext资源无法解析S3 URL相关的知识,希望对你有一定的参考价值。

我正在开发一个Spring Boot应用程序,我正在集成Amazon S3服务。 这个类是我访问S3存储桶的存储库:

public class S3FileRepository implements ImageRepository {

private String bucket;
private AmazonS3 s3Client;
private ResourceLoader resourceLoader;

public S3FileRepository(ResourceLoader resourceLoader, AmazonS3 s3Client, String bucket) {
    this.resourceLoader = resourceLoader;
    this.s3Client = s3Client;
    this.bucket = bucket;
}

private static String toS3Uri(String bucket, String imageName) {
    return String.format("s3://%s/%s", bucket, imageName);
}

@Override
public Resource getImage(String name) {
    return resourceLoader.getResource(S3FileRepository.toS3Uri(this.bucket, name).concat(this.IMAGE_EXTENSION));
}

使用Spring Boot Autoconfiguration建议。 所以在我的pom.xml,除其他外,我已经

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-aws-autoconfigure</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-aws-context</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>

此外,我有一个像这样做的application.properties

cloud.aws.credentials.accessKey= (mykey)
cloud.aws.credentials.secretKey= (mysecret)
cloud.aws.credentials.instanceProfile=true
cloud.aws.region.static=eu-west-2
cloud.aws.stack.auto=false

The problem:

一切正常,如果我编译我的项目然后我只是用java -jar target/myproject.jar运行JAR,我正确得到我要求的图像,一切都很好。

相反,如果我在尝试获取图像(存在于存储桶中)时使用IDE默认mvn spring-boot:run运行项目,则会出现以下异常:

    ServletContext resource [/s3://mybucket/test.jpeg] cannot be resolved to URL because it does not exist
java.io.FileNotFoundException: ServletContext resource [/s3://mybucket/test.jpeg] cannot be resolved to URL because it does not exist

所以我认为它会引发一个异常,因为它就像它进入jar内部寻找与s3://mybucket/test.jpeg相匹配的东西,但我无法理解为什么,以及它为什么只运行mvn spring-boot:run项目而不运行jar。

答案

您可能会遇到spring-cloud-aws问题#384,因此当您从IDE启动应用程序时激活的spring-boot-devtools依赖项会在资源加载中激活不同的代码路径。

您可以通过从spring-boot-devtools文件中删除pom.xml依赖项,在IDE中重新加载项目以及运行相同的测试来测试是否遇到此问题。

另一答案

app的启动与“java -jar”和“mvn spring-boot:run”之间存在差异。来自Spring Boot文档:“Spring Boot Maven插件包含一个可用于快速编译和运行应用程序的运行目标。应用程序以爆炸形式运行,就像在IDE中一样”。这可能是问题的原因。

以上是关于SpringBoot:ServletContext资源无法解析S3 URL的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.tomcat.JarScanner.scan(Ljavax/servlet/ServletContext;Ljava/lang/ClassLoader;Lorg/apache/t

在 ServletContext 中找不到属性 ServerContainer

java.lang.NoClassDefFoundError: javax/servlet/ServletContext

Springboot启动报错:child container failed during start

在运行 Spring MVC 应用程序时在 Spring Boot 中获取 NoSuchMethodError: javax.servlet.ServletContext.addServlet

Spring boot ---- java.lang.NoClassDefFoundError: javax/servlet/ServletContext