0

Spring Cloud AWS がSimpleStorageProtocolResolverを正しく構成していないため、すべてが開始されました。このクラスは、 ResourceLoaderの使用中に s3:// プロトコルを処理します。詳細については問題を参照してください: Spring AWS の例では org.springframework.core.io.WritableResource にキャストできません

そのため、手動で作成する必要がありました。しかし、私は LocalStack ソリューション ( https://github.com/localstack/localstack ) も使用しています。Spring Cloud AWS にはエンドポイントを手動で構成するオプションがないため、AmazonS3Clientを作成する必要がありました (何だと思いますか?)。手で。

ここで問題が発生します。クラスS3Configurationクラス (以下を参照) で両方の Bean を作成すると、Spring Framework は Bean の作成をスキップします。そして、S3Handlerクラス (以下を参照) に接続しようとすると、次のエラーが発生します: 「 amazonS3Client 」という名前の Bean の作成中にエラーが発生しました: 要求された Bean は現在作成中です: 解決できない循環参照はありますか?

しかし、繰り返しになりますが、すべてがここにあります。これらのクラス間に循環参照はありません。

プロジェクトを簡略化したので、ここに投稿できます。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>io.mobi7.ms</groupId>
    <artifactId>mobi7-temp-ms-ibutton-worker</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <spring-cloud-version>2.1.4.RELEASE</spring-cloud-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws</artifactId>
            <version>${spring-cloud-version}</version>
        </dependency>
    </dependencies>

</project>

S3Configuration.java

package io.mobi7.ms.ibutton.worker;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.aws.core.io.s3.SimpleStorageProtocolResolver;
import org.springframework.cloud.aws.core.region.RegionProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;

@Configuration
public class S3Configuration {

    @Bean("amazonS3Client") // THIS METHOD IS NOT BEING CALLED!!!
    public AmazonS3 amazonS3Client(AWSCredentialsProvider credentialsProvider,
                                   RegionProvider regionProvider,
                                   @Value("${cloud.aws.s3.default-endpoint}") String endpoint) {
        return AmazonS3ClientBuilder.standard()
            .withCredentials(credentialsProvider)
            .withEndpointConfiguration(
                new AwsClientBuilder.EndpointConfiguration(endpoint, regionProvider.getRegion().getName()))
            .build();
    }

    @Autowired  // THIS METHOD IS NOT BEING CALLED!!!
    public void configureResourceLoader(@Qualifier("amazonS3Client") AmazonS3 amazonS3Client,
                                        DefaultResourceLoader resourceLoader) {
        SimpleStorageProtocolResolver simpleStorageProtocolResolver = new SimpleStorageProtocolResolver(amazonS3Client);
        // As we are calling it by hand, we must initialize it properly.
        simpleStorageProtocolResolver.afterPropertiesSet();
        resourceLoader.addProtocolResolver(simpleStorageProtocolResolver);
    }
}

S3Handle.java

package io.mobi7.ms.ibutton.worker;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class S3Handler {

    private AmazonS3 amazonS3Client;

    @Autowired
    public S3Handler(@Qualifier("amazonS3Client") AmazonS3 amazonS3Client) {
        this.amazonS3Client = amazonS3Client;
    }

    public List<String> listFiles(String bucketName) {
        return amazonS3Client.listObjects(bucketName).getObjectSummaries().stream().map(S3ObjectSummary::getKey)
            .collect(Collectors.toList());
    }
}

アプリケーション.java

package io.mobi7.ms.ibutton.worker;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(WebApplicationType.NONE).run(args);
    }

    @Autowired
    public void listFiles(S3Handler s3Handler) {
        s3Handler.listFiles("default-s3-bucket").forEach(System.out::println);
    }
}

アプリケーションのプロパティ

cloud.aws.region.static=us-east-1
cloud.aws.stack.auto=false
cloud.aws.s3.default-endpoint=http://localhost:4572

アイデアはありますか、なぜこれが起こっているのですか?

4

1 に答える 1