SpringBoot: ресурс ServletContext не может разрешить URL-адрес S3 - PullRequest
2 голосов
/ 20 марта 2019

Я разрабатываю приложение 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

Проблема:

Все работает нормально, если я компилирую свой проект, а затем просто запускаю JAR с java -jar target/myproject.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

Так что Я думаю в том, что он выдает исключение, потому что это похоже на , он идет внутрь банки , чтобы найти что-то, что соответствует s3://mybucket/test.jpeg, но я не могу понять почему, и почему это происходит только при запуске проекта с mvn spring-boot:run и без запуска jar.

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Возможно, вы столкнулись с проблемой spring-cloud-aws # 384 , после чего зависимость spring-boot-devtools, которая активируется при запуске приложения из IDE, активирует другой путь кода при загрузке ресурса.

Вы можете проверить, решаете ли вы эту проблему, удалив зависимость spring-boot-devtools из файла pom.xml, перезагрузив проект в вашей IDE и выполнив тот же тест.

0 голосов
/ 22 марта 2019

Существует разница между запуском приложения с помощью "java -jar" и "mvn spring-boot: run". Из документов Spring Boot: «Плагин Spring Boot Maven включает цель запуска, которую можно использовать для быстрой компиляции и запуска вашего приложения. Приложения запускаются в разобранном виде , как и в вашей IDE». Это может быть причиной проблемы.

...