From 18780c158e4cc38ff2d676e5bc78786943c78a8e Mon Sep 17 00:00:00 2001 From: matejnedic Date: Sun, 20 Jul 2025 13:14:09 +0200 Subject: [PATCH 1/9] Introduce S3 Vector Client support --- docs/src/main/asciidoc/s3.adoc | 44 ++++++- spring-cloud-aws-autoconfigure/pom.xml | 6 + .../s3/S3VectorClientAutoConfiguration.java | 52 ++++++++ .../s3/S3VectorClientCustomizer.java | 15 +++ .../s3/properties/S3VectorProperties.java | 19 +++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../s3/S3VectorAutoConfigurationTests.java | 45 +++++++ .../s3/S3VectorClientCustomizerTests.java | 112 ++++++++++++++++++ spring-cloud-aws-dependencies/pom.xml | 2 +- 9 files changed, 290 insertions(+), 6 deletions(-) create mode 100644 spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java create mode 100644 spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizer.java create mode 100644 spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/properties/S3VectorProperties.java create mode 100644 spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java create mode 100644 spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizerTests.java diff --git a/docs/src/main/asciidoc/s3.adoc b/docs/src/main/asciidoc/s3.adoc index 6a9fc318a..9391dff14 100644 --- a/docs/src/main/asciidoc/s3.adoc +++ b/docs/src/main/asciidoc/s3.adoc @@ -604,17 +604,51 @@ The Spring Boot Starter for S3 provides the following configuration options: | `spring.cloud.aws.s3.config.reload.max-wait-time-for-restart` | `Duration`| `2s` | The maximum time between the detection of changes in property source and the application context restart when `restart_context` strategy is used. |=== +=== S3 Vector Client support + +https://aws.amazon.com/blogs/aws/introducing-amazon-s3-vectors-first-cloud-storage-with-native-vector-support-at-scale/[S3 Vector Store] is a vector storage which supports uploading, storing and querying vectors. +To allow users simpler use of `S3VectorsClient` with https://github.com/spring-projects/spring-ai[Spring AI] project or use of a plain client, we support autoconfiguration of the `S3VectorsClient`. + +To enable autoconfiguration you should add the following dependencies +[source,xml] +---- + + io.awspring.cloud + spring-cloud-aws-starter + + + + software.amazon.awssdk + s3vectors + +---- + +After dependencies are introduced Spring Cloud AWS will automatically create a `S3VectorsClient` bean which can than be autowired and used. + +[cols="2,3,1,1"] +|=== +| Name | Description | Required | Default value +| `spring.cloud.aws.s3.vector.config.enabled` | Enables the S3 config import integration. | No | `true` +| `spring.cloud.aws.s3.config.reload.strategy` | `Enum` | `refresh` | The strategy to use when firing a reload (`refresh`, `restart_context`) +| `spring.cloud.aws.s3.config.reload.period` | `Duration`| `15s` | The period for verifying changes +| `spring.cloud.aws.s3.config.reload.max-wait-time-for-restart` | `Duration`| `2s` | The maximum time between the detection of changes in property source and the application context restart when `restart_context` strategy is used. +|=== === IAM Permissions Following IAM permissions are required by Spring Cloud AWS: -[cols="2,1"] -|=== -| Downloading files | `s3:GetObject` -| Searching files | `s3:ListObjects` -| Uploading files | `s3:PutObject` +[cols="2,3,1,1"] |=== +| Name | Description | Required | Default value +| `spring.cloud.aws.s3.vector.enabled` | Enables the S3VectorsClient autoconfiguration. | No | `true` +| `spring.cloud.aws.s3.vector.endpoint` | Configures endpoint used by `S3VectorsClient`. | No | `http://localhost:4566` +| `spring.cloud.aws.s3.vector.region` | Configures region used by `S3VectorsClient`. | No | `eu-west-1` + + + + +=== Example of IAM policy for Spring Cloud AWS demo bucket Sample IAM policy granting access to `spring-cloud-aws-demo` bucket: diff --git a/spring-cloud-aws-autoconfigure/pom.xml b/spring-cloud-aws-autoconfigure/pom.xml index fade54b61..bd44c615d 100644 --- a/spring-cloud-aws-autoconfigure/pom.xml +++ b/spring-cloud-aws-autoconfigure/pom.xml @@ -176,6 +176,12 @@ amazon-s3-encryption-client-java true + + + software.amazon.awssdk + s3vectors + true + io.micrometer micrometer-observation-test diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java new file mode 100644 index 000000000..9c94ba4be --- /dev/null +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java @@ -0,0 +1,52 @@ +package io.awspring.cloud.autoconfigure.s3; + +import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; +import io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer; +import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer; +import io.awspring.cloud.autoconfigure.core.AwsConnectionDetails; +import io.awspring.cloud.autoconfigure.core.AwsProperties; +import io.awspring.cloud.autoconfigure.s3.properties.S3VectorProperties; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import software.amazon.awssdk.services.s3vectors.S3VectorsClient; +import software.amazon.awssdk.services.s3vectors.S3VectorsClientBuilder; + +/** + * @author Matej Nedic + * @since 3.5.0 + */ +@AutoConfiguration +@ConditionalOnClass({S3VectorsClient.class}) +@EnableConfigurationProperties({S3VectorProperties.class, AwsProperties.class}) +@ConditionalOnProperty(name = "spring.cloud.aws.s3.vector.enabled", havingValue = "true", matchIfMissing = true) +public class S3VectorClientAutoConfiguration { + + private final S3VectorProperties properties; + + public S3VectorClientAutoConfiguration(S3VectorProperties properties) { + this.properties = properties; + } + + @Bean + @ConditionalOnMissingBean + S3VectorsClientBuilder s3ClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer, + ObjectProvider> configurer, + ObjectProvider connectionDetails, + ObjectProvider s3ClientCustomizers, + ObjectProvider awsSyncClientCustomizers) { + + return awsClientBuilderConfigurer.configureSyncClient(S3VectorsClient.builder(), this.properties, + connectionDetails.getIfAvailable(), configurer.getIfAvailable(), s3ClientCustomizers.orderedStream(), + awsSyncClientCustomizers.orderedStream()); + } + + @Bean + S3VectorsClient s3VectorsClient(S3VectorsClientBuilder builder) { + return builder.build(); + } +} diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizer.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizer.java new file mode 100644 index 000000000..a132ca901 --- /dev/null +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizer.java @@ -0,0 +1,15 @@ +package io.awspring.cloud.autoconfigure.s3; + +import io.awspring.cloud.autoconfigure.AwsClientCustomizer; +import software.amazon.awssdk.services.s3.S3ClientBuilder; +import software.amazon.awssdk.services.s3vectors.S3VectorsClientBuilder; + +/** + * Callback interface that can be used to customize a {@link S3ClientBuilder}. + * + * @author Matej Nedic + * @since 3.5.0 + */ +@FunctionalInterface +public interface S3VectorClientCustomizer extends AwsClientCustomizer { +} diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/properties/S3VectorProperties.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/properties/S3VectorProperties.java new file mode 100644 index 000000000..6303b662e --- /dev/null +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/properties/S3VectorProperties.java @@ -0,0 +1,19 @@ +package io.awspring.cloud.autoconfigure.s3.properties; + +import io.awspring.cloud.autoconfigure.AwsClientProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; + + +/** + * @author Matej Nedic + */ +@ConfigurationProperties(prefix = S3VectorProperties.PREFIX) +public class S3VectorProperties extends AwsClientProperties { + + /** + * The prefix used for S3 related properties. + */ + public static final String PREFIX = "spring.cloud.aws.s3.vector"; + + +} diff --git a/spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 657cbf245..9e5b9c476 100644 --- a/spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -7,6 +7,7 @@ io.awspring.cloud.autoconfigure.ses.SesAutoConfiguration io.awspring.cloud.autoconfigure.s3.S3TransferManagerAutoConfiguration io.awspring.cloud.autoconfigure.s3.S3AutoConfiguration io.awspring.cloud.autoconfigure.s3.S3CrtAsyncClientAutoConfiguration +io.awspring.cloud.autoconfigure.s3.S3VectorClientAutoConfiguration io.awspring.cloud.autoconfigure.sns.SnsAutoConfiguration io.awspring.cloud.autoconfigure.sqs.SqsAutoConfiguration io.awspring.cloud.autoconfigure.dynamodb.DynamoDbAutoConfiguration diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java new file mode 100644 index 000000000..7b6893091 --- /dev/null +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java @@ -0,0 +1,45 @@ +package io.awspring.cloud.autoconfigure.s3; + +import io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration; +import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration; +import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration; +import io.awspring.cloud.autoconfigure.s3.properties.S3Properties; +import io.awspring.cloud.s3.S3OutputStreamProvider; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.FilteredClassLoader; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3ClientBuilder; +import software.amazon.awssdk.services.s3vectors.S3VectorsClient; +import software.amazon.encryption.s3.S3EncryptionClient; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for {@link S3AutoConfiguration} class + * + * @author Matej Nedic + */ +public class S3VectorAutoConfigurationTests { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withPropertyValues("spring.cloud.aws.region.static:eu-west-1") + .withConfiguration(AutoConfigurations.of(AwsAutoConfiguration.class, RegionProviderAutoConfiguration.class, + CredentialsProviderAutoConfiguration.class, S3VectorClientAutoConfiguration.class)); + + + @Test + void createsS3VectorClientBean() { + this.contextRunner.run(context -> { + assertThat(context).hasSingleBean(S3VectorsClient.class); + }); + } + + @Test + void s3VectorClientAutoConfigurationIsDisabled() { + this.contextRunner.withPropertyValues("spring.cloud.aws.s3.vector.enabled:false").run(context -> { + assertThat(context).doesNotHaveBean(S3VectorsClient.class); + }); + } +} diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizerTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizerTests.java new file mode 100644 index 000000000..3ec752f68 --- /dev/null +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizerTests.java @@ -0,0 +1,112 @@ +package io.awspring.cloud.autoconfigure.s3; + +import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; +import io.awspring.cloud.autoconfigure.ConfiguredAwsClient; +import io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration; +import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration; +import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import software.amazon.awssdk.http.apache.ApacheHttpClient; +import software.amazon.awssdk.services.s3vectors.S3VectorsClient; + +import java.time.Duration; + +import static org.assertj.core.api.Assertions.assertThat; + + +/** + * Tests for {@link S3VectorClientCustomizer}. + * + * @author Matej Nedic + * @author Maciej Walkowiak + */ +public class S3VectorClientCustomizerTests { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withPropertyValues("spring.cloud.aws.region.static:eu-west-1", + "spring.cloud.aws.credentials.access-key:noop", "spring.cloud.aws.credentials.secret-key:noop") + .withConfiguration(AutoConfigurations.of(AwsAutoConfiguration.class, RegionProviderAutoConfiguration.class, + CredentialsProviderAutoConfiguration.class, S3VectorClientAutoConfiguration.class)); + + @Test + void customClientCustomizer() { + contextRunner.withUserConfiguration(S3VectorClientCustomizerTests.CustomizerConfig.class).run(context -> { + ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(S3VectorsClient.class)); + assertThat(client.getApiCallTimeout()).describedAs("sets property from first customizer") + .isEqualTo(Duration.ofMillis(2001)); + assertThat(client.getApiCallAttemptTimeout()).describedAs("sets property from second customizer") + .isEqualTo(Duration.ofMillis(2002)); + assertThat(client.getSyncHttpClient()).describedAs("sets property from common client customizer") + .isNotNull(); + }); + } + + @Test + void customClientCustomizerWithOrder() { + contextRunner.withUserConfiguration(S3VectorClientCustomizerTests.CustomizerConfigWithOrder.class).run(context -> { + ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(S3VectorsClient.class)); + assertThat(client.getApiCallTimeout()) + .describedAs("property from the customizer with higher order takes precedence") + .isEqualTo(Duration.ofMillis(2001)); + }); + } + + + @Configuration(proxyBeanMethods = false) + static class CustomizerConfig { + + @Bean + S3VectorClientCustomizer customizer() { + return builder -> { + builder.overrideConfiguration(builder.overrideConfiguration().copy(c -> { + c.apiCallTimeout(Duration.ofMillis(2001)); + })); + }; + } + + @Bean + S3VectorClientCustomizer customizer2() { + return builder -> { + builder.overrideConfiguration(builder.overrideConfiguration().copy(c -> { + c.apiCallAttemptTimeout(Duration.ofMillis(2002)); + })); + }; + } + + @Bean + AwsSyncClientCustomizer awsSyncClientCustomizer() { + return builder -> { + builder.httpClient(ApacheHttpClient.builder().connectionTimeout(Duration.ofMillis(1542)).build()); + }; + } + } + + @Configuration(proxyBeanMethods = false) + static class CustomizerConfigWithOrder { + + @Bean + @Order(2) + S3VectorClientCustomizer customizer() { + return builder -> { + builder.overrideConfiguration(builder.overrideConfiguration().copy(c -> { + c.apiCallTimeout(Duration.ofMillis(2001)); + })); + }; + } + + @Bean + @Order(1) + S3VectorClientCustomizer customizer2() { + return builder -> { + builder.overrideConfiguration(builder.overrideConfiguration().copy(c -> { + c.apiCallTimeout(Duration.ofMillis(2000)); + })); + }; + } + } +} diff --git a/spring-cloud-aws-dependencies/pom.xml b/spring-cloud-aws-dependencies/pom.xml index 8c12a8777..33e3e4dce 100644 --- a/spring-cloud-aws-dependencies/pom.xml +++ b/spring-cloud-aws-dependencies/pom.xml @@ -24,7 +24,7 @@ 2.31.0 - 2.29.52 + 2.32.4 2.0.5 3.3.0 1.6 From 7e9451561b6f6289e145ee68fec9d94f4fcbd913 Mon Sep 17 00:00:00 2001 From: matejnedic Date: Sun, 20 Jul 2025 14:35:15 +0200 Subject: [PATCH 2/9] polish --- .../autoconfigure/s3/S3VectorAutoConfigurationTests.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java index 7b6893091..306d765d8 100644 --- a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java @@ -3,16 +3,10 @@ import io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration; import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration; import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration; -import io.awspring.cloud.autoconfigure.s3.properties.S3Properties; -import io.awspring.cloud.s3.S3OutputStreamProvider; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.S3ClientBuilder; import software.amazon.awssdk.services.s3vectors.S3VectorsClient; -import software.amazon.encryption.s3.S3EncryptionClient; import static org.assertj.core.api.Assertions.assertThat; From ef6735d065bccfc3bc962723e7da0b3317847f89 Mon Sep 17 00:00:00 2001 From: matejnedic Date: Sun, 20 Jul 2025 14:46:44 +0200 Subject: [PATCH 3/9] polish --- .../cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java index 9c94ba4be..5bcef83e1 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java @@ -34,7 +34,7 @@ public S3VectorClientAutoConfiguration(S3VectorProperties properties) { @Bean @ConditionalOnMissingBean - S3VectorsClientBuilder s3ClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer, + S3VectorsClientBuilder s3VectorsClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer, ObjectProvider> configurer, ObjectProvider connectionDetails, ObjectProvider s3ClientCustomizers, From 9e97ad25139d8c654c5714c55bd54c24b3251cf7 Mon Sep 17 00:00:00 2001 From: matejnedic Date: Mon, 21 Jul 2025 20:00:32 +0200 Subject: [PATCH 4/9] Update --- .../autoconfigure/s3/S3VectorClientAutoConfiguration.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java index 5bcef83e1..035de8f98 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java @@ -1,13 +1,11 @@ package io.awspring.cloud.autoconfigure.s3; import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; -import io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer; -import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer; -import io.awspring.cloud.autoconfigure.core.AwsConnectionDetails; -import io.awspring.cloud.autoconfigure.core.AwsProperties; +import io.awspring.cloud.autoconfigure.core.*; import io.awspring.cloud.autoconfigure.s3.properties.S3VectorProperties; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -23,6 +21,7 @@ @AutoConfiguration @ConditionalOnClass({S3VectorsClient.class}) @EnableConfigurationProperties({S3VectorProperties.class, AwsProperties.class}) +@AutoConfigureAfter({ CredentialsProviderAutoConfiguration.class, RegionProviderAutoConfiguration.class }) @ConditionalOnProperty(name = "spring.cloud.aws.s3.vector.enabled", havingValue = "true", matchIfMissing = true) public class S3VectorClientAutoConfiguration { From 1e1bd4cfdb27e1eacbe3a132797c50c4ea56b126 Mon Sep 17 00:00:00 2001 From: matejnedic Date: Thu, 25 Sep 2025 19:17:03 +0200 Subject: [PATCH 5/9] amend --- .../S3VectorClientAutoConfiguration.java | 3 +-- .../S3VectorClientCustomizer.java | 2 +- .../S3VectorProperties.java | 2 +- .../autoconfigure/s3vectors/package-info.java | 22 +++++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 2 +- .../S3VectorAutoConfigurationTests.java | 4 ++-- .../S3VectorClientCustomizerTests.java | 2 +- 7 files changed, 29 insertions(+), 8 deletions(-) rename spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/{s3 => s3vectors}/S3VectorClientAutoConfiguration.java (95%) rename spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/{s3 => s3vectors}/S3VectorClientCustomizer.java (89%) rename spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/{s3/properties => s3vectors}/S3VectorProperties.java (88%) create mode 100644 spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/package-info.java rename spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/{s3 => s3vectors}/S3VectorAutoConfigurationTests.java (92%) rename spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/{s3 => s3vectors}/S3VectorClientCustomizerTests.java (98%) diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java similarity index 95% rename from spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java rename to spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java index 035de8f98..55e813604 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientAutoConfiguration.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java @@ -1,8 +1,7 @@ -package io.awspring.cloud.autoconfigure.s3; +package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; import io.awspring.cloud.autoconfigure.core.*; -import io.awspring.cloud.autoconfigure.s3.properties.S3VectorProperties; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizer.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java similarity index 89% rename from spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizer.java rename to spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java index a132ca901..0367b82d7 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizer.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java @@ -1,4 +1,4 @@ -package io.awspring.cloud.autoconfigure.s3; +package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsClientCustomizer; import software.amazon.awssdk.services.s3.S3ClientBuilder; diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/properties/S3VectorProperties.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java similarity index 88% rename from spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/properties/S3VectorProperties.java rename to spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java index 6303b662e..db0c3b9c0 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/properties/S3VectorProperties.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java @@ -1,4 +1,4 @@ -package io.awspring.cloud.autoconfigure.s3.properties; +package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsClientProperties; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/package-info.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/package-info.java new file mode 100644 index 000000000..06b170a2c --- /dev/null +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/package-info.java @@ -0,0 +1,22 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Auto-configuration for S3Vector integration. + */ +@org.springframework.lang.NonNullApi +@org.springframework.lang.NonNullFields +package io.awspring.cloud.autoconfigure.s3vectors; diff --git a/spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 9e5b9c476..685d3a75a 100644 --- a/spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -7,7 +7,7 @@ io.awspring.cloud.autoconfigure.ses.SesAutoConfiguration io.awspring.cloud.autoconfigure.s3.S3TransferManagerAutoConfiguration io.awspring.cloud.autoconfigure.s3.S3AutoConfiguration io.awspring.cloud.autoconfigure.s3.S3CrtAsyncClientAutoConfiguration -io.awspring.cloud.autoconfigure.s3.S3VectorClientAutoConfiguration +io.awspring.cloud.autoconfigure.s3vectors.S3VectorClientAutoConfiguration io.awspring.cloud.autoconfigure.sns.SnsAutoConfiguration io.awspring.cloud.autoconfigure.sqs.SqsAutoConfiguration io.awspring.cloud.autoconfigure.dynamodb.DynamoDbAutoConfiguration diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorAutoConfigurationTests.java similarity index 92% rename from spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java rename to spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorAutoConfigurationTests.java index 306d765d8..09d20e162 100644 --- a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorAutoConfigurationTests.java +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorAutoConfigurationTests.java @@ -1,4 +1,4 @@ -package io.awspring.cloud.autoconfigure.s3; +package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration; import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration; @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Test for {@link S3AutoConfiguration} class + * Test for {@link S3VectorAutoConfigurationTests} class * * @author Matej Nedic */ diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizerTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java similarity index 98% rename from spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizerTests.java rename to spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java index 3ec752f68..a7955eda0 100644 --- a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3VectorClientCustomizerTests.java +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java @@ -1,4 +1,4 @@ -package io.awspring.cloud.autoconfigure.s3; +package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; import io.awspring.cloud.autoconfigure.ConfiguredAwsClient; From 4c55daaa5e961af909603b60495f35208a409152 Mon Sep 17 00:00:00 2001 From: matejnedic Date: Thu, 25 Sep 2025 19:26:06 +0200 Subject: [PATCH 6/9] amend --- .../s3vectors/S3VectorClientAutoConfiguration.java | 2 +- .../autoconfigure/s3vectors/S3VectorClientCustomizer.java | 5 ++--- .../cloud/autoconfigure/s3vectors/S3VectorProperties.java | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java index 55e813604..b200dfba1 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java @@ -15,7 +15,7 @@ /** * @author Matej Nedic - * @since 3.5.0 + * @since 4.0.0 */ @AutoConfiguration @ConditionalOnClass({S3VectorsClient.class}) diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java index 0367b82d7..e324eebeb 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java @@ -1,14 +1,13 @@ package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsClientCustomizer; -import software.amazon.awssdk.services.s3.S3ClientBuilder; import software.amazon.awssdk.services.s3vectors.S3VectorsClientBuilder; /** - * Callback interface that can be used to customize a {@link S3ClientBuilder}. + * Callback interface that can be used to customize a {@link S3VectorsClientBuilder}. * * @author Matej Nedic - * @since 3.5.0 + * @since 4.0.0 */ @FunctionalInterface public interface S3VectorClientCustomizer extends AwsClientCustomizer { diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java index db0c3b9c0..e9c72879b 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java @@ -6,6 +6,7 @@ /** * @author Matej Nedic + * @since 4.0.0 */ @ConfigurationProperties(prefix = S3VectorProperties.PREFIX) public class S3VectorProperties extends AwsClientProperties { From 248d78bacdda995484cc791a3e41048ff9f78135 Mon Sep 17 00:00:00 2001 From: matejnedic Date: Thu, 25 Sep 2025 22:45:35 +0200 Subject: [PATCH 7/9] test --- .../autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java index b200dfba1..5fac3be46 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java @@ -1,6 +1,7 @@ package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; +import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer; import io.awspring.cloud.autoconfigure.core.*; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; From 9658c05ee8ce21c8e010d5fc0927eca4c1d92966 Mon Sep 17 00:00:00 2001 From: matejnedic Date: Tue, 14 Oct 2025 14:44:08 +0200 Subject: [PATCH 8/9] Apply copyright --- .../S3VectorClientAutoConfiguration.java | 35 +++++++++---- .../s3vectors/S3VectorClientCustomizer.java | 15 ++++++ .../s3vectors/S3VectorProperties.java | 17 ++++++- .../S3VectorAutoConfigurationTests.java | 26 +++++++--- .../S3VectorClientCustomizerTests.java | 51 ++++++++++++------- 5 files changed, 107 insertions(+), 37 deletions(-) diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java index 5fac3be46..6a449a2a7 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java @@ -1,8 +1,23 @@ +/* + * Copyright 2013-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; -import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer; import io.awspring.cloud.autoconfigure.core.*; +import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -19,8 +34,8 @@ * @since 4.0.0 */ @AutoConfiguration -@ConditionalOnClass({S3VectorsClient.class}) -@EnableConfigurationProperties({S3VectorProperties.class, AwsProperties.class}) +@ConditionalOnClass({ S3VectorsClient.class }) +@EnableConfigurationProperties({ S3VectorProperties.class, AwsProperties.class }) @AutoConfigureAfter({ CredentialsProviderAutoConfiguration.class, RegionProviderAutoConfiguration.class }) @ConditionalOnProperty(name = "spring.cloud.aws.s3.vector.enabled", havingValue = "true", matchIfMissing = true) public class S3VectorClientAutoConfiguration { @@ -34,14 +49,14 @@ public S3VectorClientAutoConfiguration(S3VectorProperties properties) { @Bean @ConditionalOnMissingBean S3VectorsClientBuilder s3VectorsClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer, - ObjectProvider> configurer, - ObjectProvider connectionDetails, - ObjectProvider s3ClientCustomizers, - ObjectProvider awsSyncClientCustomizers) { + ObjectProvider> configurer, + ObjectProvider connectionDetails, + ObjectProvider s3ClientCustomizers, + ObjectProvider awsSyncClientCustomizers) { - return awsClientBuilderConfigurer.configureSyncClient(S3VectorsClient.builder(), this.properties, - connectionDetails.getIfAvailable(), configurer.getIfAvailable(), s3ClientCustomizers.orderedStream(), - awsSyncClientCustomizers.orderedStream()); + return awsClientBuilderConfigurer.configureSyncClient(S3VectorsClient.builder(), this.properties, + connectionDetails.getIfAvailable(), configurer.getIfAvailable(), s3ClientCustomizers.orderedStream(), + awsSyncClientCustomizers.orderedStream()); } @Bean diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java index e324eebeb..636914f5a 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizer.java @@ -1,3 +1,18 @@ +/* + * Copyright 2013-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsClientCustomizer; diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java index e9c72879b..3e12f5b69 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorProperties.java @@ -1,9 +1,23 @@ +/* + * Copyright 2013-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.awspring.cloud.autoconfigure.s3vectors; import io.awspring.cloud.autoconfigure.AwsClientProperties; import org.springframework.boot.context.properties.ConfigurationProperties; - /** * @author Matej Nedic * @since 4.0.0 @@ -16,5 +30,4 @@ public class S3VectorProperties extends AwsClientProperties { */ public static final String PREFIX = "spring.cloud.aws.s3.vector"; - } diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorAutoConfigurationTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorAutoConfigurationTests.java index 09d20e162..76dd18a43 100644 --- a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorAutoConfigurationTests.java +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorAutoConfigurationTests.java @@ -1,5 +1,22 @@ +/* + * Copyright 2013-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.awspring.cloud.autoconfigure.s3vectors; +import static org.assertj.core.api.Assertions.assertThat; + import io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration; import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration; import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration; @@ -8,8 +25,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import software.amazon.awssdk.services.s3vectors.S3VectorsClient; -import static org.assertj.core.api.Assertions.assertThat; - /** * Test for {@link S3VectorAutoConfigurationTests} class * @@ -18,10 +33,9 @@ public class S3VectorAutoConfigurationTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withPropertyValues("spring.cloud.aws.region.static:eu-west-1") - .withConfiguration(AutoConfigurations.of(AwsAutoConfiguration.class, RegionProviderAutoConfiguration.class, - CredentialsProviderAutoConfiguration.class, S3VectorClientAutoConfiguration.class)); - + .withPropertyValues("spring.cloud.aws.region.static:eu-west-1") + .withConfiguration(AutoConfigurations.of(AwsAutoConfiguration.class, RegionProviderAutoConfiguration.class, + CredentialsProviderAutoConfiguration.class, S3VectorClientAutoConfiguration.class)); @Test void createsS3VectorClientBean() { diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java index a7955eda0..1e5dff590 100644 --- a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java @@ -1,10 +1,28 @@ +/* + * Copyright 2013-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package io.awspring.cloud.autoconfigure.s3vectors; +import static org.assertj.core.api.Assertions.assertThat; + import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; import io.awspring.cloud.autoconfigure.ConfiguredAwsClient; import io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration; import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration; import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration; +import java.time.Duration; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -14,11 +32,6 @@ import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.s3vectors.S3VectorsClient; -import java.time.Duration; - -import static org.assertj.core.api.Assertions.assertThat; - - /** * Tests for {@link S3VectorClientCustomizer}. * @@ -28,35 +41,35 @@ public class S3VectorClientCustomizerTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withPropertyValues("spring.cloud.aws.region.static:eu-west-1", - "spring.cloud.aws.credentials.access-key:noop", "spring.cloud.aws.credentials.secret-key:noop") - .withConfiguration(AutoConfigurations.of(AwsAutoConfiguration.class, RegionProviderAutoConfiguration.class, - CredentialsProviderAutoConfiguration.class, S3VectorClientAutoConfiguration.class)); + .withPropertyValues("spring.cloud.aws.region.static:eu-west-1", + "spring.cloud.aws.credentials.access-key:noop", "spring.cloud.aws.credentials.secret-key:noop") + .withConfiguration(AutoConfigurations.of(AwsAutoConfiguration.class, RegionProviderAutoConfiguration.class, + CredentialsProviderAutoConfiguration.class, S3VectorClientAutoConfiguration.class)); @Test void customClientCustomizer() { contextRunner.withUserConfiguration(S3VectorClientCustomizerTests.CustomizerConfig.class).run(context -> { ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(S3VectorsClient.class)); assertThat(client.getApiCallTimeout()).describedAs("sets property from first customizer") - .isEqualTo(Duration.ofMillis(2001)); + .isEqualTo(Duration.ofMillis(2001)); assertThat(client.getApiCallAttemptTimeout()).describedAs("sets property from second customizer") - .isEqualTo(Duration.ofMillis(2002)); + .isEqualTo(Duration.ofMillis(2002)); assertThat(client.getSyncHttpClient()).describedAs("sets property from common client customizer") - .isNotNull(); + .isNotNull(); }); } @Test void customClientCustomizerWithOrder() { - contextRunner.withUserConfiguration(S3VectorClientCustomizerTests.CustomizerConfigWithOrder.class).run(context -> { - ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(S3VectorsClient.class)); - assertThat(client.getApiCallTimeout()) - .describedAs("property from the customizer with higher order takes precedence") - .isEqualTo(Duration.ofMillis(2001)); - }); + contextRunner.withUserConfiguration(S3VectorClientCustomizerTests.CustomizerConfigWithOrder.class) + .run(context -> { + ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(S3VectorsClient.class)); + assertThat(client.getApiCallTimeout()) + .describedAs("property from the customizer with higher order takes precedence") + .isEqualTo(Duration.ofMillis(2001)); + }); } - @Configuration(proxyBeanMethods = false) static class CustomizerConfig { From eb18ab45bd1ccf85902b685f33e2945b281c0e1a Mon Sep 17 00:00:00 2001 From: matejnedic Date: Tue, 14 Oct 2025 15:05:05 +0200 Subject: [PATCH 9/9] apply 4.0.0 --- .../S3VectorClientAutoConfiguration.java | 4 +- .../S3VectorClientCustomizerTests.java | 125 ------------------ 2 files changed, 1 insertion(+), 128 deletions(-) delete mode 100644 spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java index 6a449a2a7..523233970 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientAutoConfiguration.java @@ -17,7 +17,6 @@ import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; import io.awspring.cloud.autoconfigure.core.*; -import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -49,13 +48,12 @@ public S3VectorClientAutoConfiguration(S3VectorProperties properties) { @Bean @ConditionalOnMissingBean S3VectorsClientBuilder s3VectorsClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer, - ObjectProvider> configurer, ObjectProvider connectionDetails, ObjectProvider s3ClientCustomizers, ObjectProvider awsSyncClientCustomizers) { return awsClientBuilderConfigurer.configureSyncClient(S3VectorsClient.builder(), this.properties, - connectionDetails.getIfAvailable(), configurer.getIfAvailable(), s3ClientCustomizers.orderedStream(), + connectionDetails.getIfAvailable(), s3ClientCustomizers.orderedStream(), awsSyncClientCustomizers.orderedStream()); } diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java deleted file mode 100644 index 1e5dff590..000000000 --- a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3vectors/S3VectorClientCustomizerTests.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2013-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.awspring.cloud.autoconfigure.s3vectors; - -import static org.assertj.core.api.Assertions.assertThat; - -import io.awspring.cloud.autoconfigure.AwsSyncClientCustomizer; -import io.awspring.cloud.autoconfigure.ConfiguredAwsClient; -import io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration; -import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration; -import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration; -import java.time.Duration; -import org.junit.jupiter.api.Test; -import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import software.amazon.awssdk.http.apache.ApacheHttpClient; -import software.amazon.awssdk.services.s3vectors.S3VectorsClient; - -/** - * Tests for {@link S3VectorClientCustomizer}. - * - * @author Matej Nedic - * @author Maciej Walkowiak - */ -public class S3VectorClientCustomizerTests { - - private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withPropertyValues("spring.cloud.aws.region.static:eu-west-1", - "spring.cloud.aws.credentials.access-key:noop", "spring.cloud.aws.credentials.secret-key:noop") - .withConfiguration(AutoConfigurations.of(AwsAutoConfiguration.class, RegionProviderAutoConfiguration.class, - CredentialsProviderAutoConfiguration.class, S3VectorClientAutoConfiguration.class)); - - @Test - void customClientCustomizer() { - contextRunner.withUserConfiguration(S3VectorClientCustomizerTests.CustomizerConfig.class).run(context -> { - ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(S3VectorsClient.class)); - assertThat(client.getApiCallTimeout()).describedAs("sets property from first customizer") - .isEqualTo(Duration.ofMillis(2001)); - assertThat(client.getApiCallAttemptTimeout()).describedAs("sets property from second customizer") - .isEqualTo(Duration.ofMillis(2002)); - assertThat(client.getSyncHttpClient()).describedAs("sets property from common client customizer") - .isNotNull(); - }); - } - - @Test - void customClientCustomizerWithOrder() { - contextRunner.withUserConfiguration(S3VectorClientCustomizerTests.CustomizerConfigWithOrder.class) - .run(context -> { - ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(S3VectorsClient.class)); - assertThat(client.getApiCallTimeout()) - .describedAs("property from the customizer with higher order takes precedence") - .isEqualTo(Duration.ofMillis(2001)); - }); - } - - @Configuration(proxyBeanMethods = false) - static class CustomizerConfig { - - @Bean - S3VectorClientCustomizer customizer() { - return builder -> { - builder.overrideConfiguration(builder.overrideConfiguration().copy(c -> { - c.apiCallTimeout(Duration.ofMillis(2001)); - })); - }; - } - - @Bean - S3VectorClientCustomizer customizer2() { - return builder -> { - builder.overrideConfiguration(builder.overrideConfiguration().copy(c -> { - c.apiCallAttemptTimeout(Duration.ofMillis(2002)); - })); - }; - } - - @Bean - AwsSyncClientCustomizer awsSyncClientCustomizer() { - return builder -> { - builder.httpClient(ApacheHttpClient.builder().connectionTimeout(Duration.ofMillis(1542)).build()); - }; - } - } - - @Configuration(proxyBeanMethods = false) - static class CustomizerConfigWithOrder { - - @Bean - @Order(2) - S3VectorClientCustomizer customizer() { - return builder -> { - builder.overrideConfiguration(builder.overrideConfiguration().copy(c -> { - c.apiCallTimeout(Duration.ofMillis(2001)); - })); - }; - } - - @Bean - @Order(1) - S3VectorClientCustomizer customizer2() { - return builder -> { - builder.overrideConfiguration(builder.overrideConfiguration().copy(c -> { - c.apiCallTimeout(Duration.ofMillis(2000)); - })); - }; - } - } -}