SpringBoot: ресурсу ServletContext не удается разрешить URL S3

#java #spring-boot #servlets #amazon-s3 #spring-cloud-aws

#java #весенняя загрузка #сервлеты #amazon-s3 #spring-cloud-aws

Вопрос:

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

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

Комментарии:

1. Вам нужно будет указать как IDE, так и полную трассировку стека ошибки. (Обратите внимание, что, если вам не нужно обрабатывать изображение локально, для всех вас намного проще просто вернуть клиенту URI HTTP S3; jets3t упрощает генерацию подписанных URI.)

Ответ №1:

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

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

Ответ №2:

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