diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml
index 7e61ca18af..a1f3ee6203 100644
--- a/spring-boot-modules/spring-boot-3/pom.xml
+++ b/spring-boot-modules/spring-boot-3/pom.xml
@@ -94,6 +94,75 @@
org.springframework.boot
spring-boot-starter-test
+
+ org.springframework.boot
+ spring-boot-testcontainers
+ test
+
+
+ org.testcontainers
+ postgresql
+ test
+
+
+ org.testcontainers
+ junit-jupiter
+ ${testcontainers.version}
+ test
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+ org.springframework.amqp
+ spring-rabbit-test
+ test
+
+
+ org.springframework.data
+ spring-data-redis
+
+
+ redis.clients
+ jedis
+ jar
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.postgresql
+ r2dbc-postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-data-r2dbc
+
+
+ io.projectreactor
+ reactor-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-data-elasticsearch
+
+
+ org.springframework.boot
+ spring-boot-starter-data-cassandra
+
+
+ org.springframework.boot
+ spring-boot-starter-data-neo4j
+
@@ -189,6 +258,7 @@
5.14.0
3.1.0
0.2.0
+ 1.18.3
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java
new file mode 100644
index 0000000000..a9b49e24e3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java
@@ -0,0 +1,16 @@
+package com.baeldung.connectiondetails;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan(basePackages = "com.baeldung.connectiondetails")
+public class ConnectionDetailsApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConnectionDetailsApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java
new file mode 100644
index 0000000000..1c9449ad00
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java
@@ -0,0 +1,107 @@
+package com.baeldung.connectiondetails.adapter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VaultAdapter {
+ private static final Logger logger = LoggerFactory.getLogger(VaultAdapter.class);
+ public static String getSecret(String secretKey) {
+ logger.info("call vault to get the secret of key: " + secretKey);
+
+ //Postgres keys
+ if (secretKey.equalsIgnoreCase("postgres_secret_key")) {
+ return "postgres";
+ }
+ if (secretKey.equalsIgnoreCase("postgres_user_key")) {
+ return "postgres";
+ }
+ if (secretKey.equalsIgnoreCase("postgres_jdbc_url")) {
+ return "jdbc:postgresql://localhost:15432/postgresdb";
+ }
+ //RabbitMQ Server Keys
+ if (secretKey.equalsIgnoreCase("rabbitmq_username")) {
+ return "rabbitmquser";
+ }
+ if (secretKey.equalsIgnoreCase("rabbitmq_password")) {
+ return "rabbitmq";
+ }
+ if (secretKey.equalsIgnoreCase("rabbitmq_port")) {
+ return "5672";
+ }
+ if (secretKey.equalsIgnoreCase("rabbitmq_host")) {
+ return "localhost";
+ }
+ //Redis Server Keys
+ if (secretKey.equalsIgnoreCase("redis_username")) {
+ return null;
+ }
+ if (secretKey.equalsIgnoreCase("redis_password")) {
+ return "redis";
+ }
+ if (secretKey.equalsIgnoreCase("redis_port")) {
+ return "6379";
+ }
+ if (secretKey.equalsIgnoreCase("redis_host")) {
+ return "localhost";
+ }
+ //Mongo DB Keys
+ if (secretKey.equalsIgnoreCase("mongo_connection_string")) {
+ return "mongodb://localhost:27017/demodb";
+ }
+
+ //r2dbc Keys
+ if (secretKey.equalsIgnoreCase("r2dbc_postgres_user")) {
+ return "postgres";
+ }
+ if (secretKey.equalsIgnoreCase("r2dbc_postgres_secret")) {
+ return "postgres";
+ }
+ if (secretKey.equalsIgnoreCase("r2dbc_postgres_host")) {
+ return "localhost";
+ }
+ if (secretKey.equalsIgnoreCase("r2dbc_postgres_port")) {
+ return "15432";
+ }
+ if (secretKey.equalsIgnoreCase("r2dbc_postgres_database")) {
+ return "postgresdb";
+ }
+ //Elastic Search Keys
+ if (secretKey.equalsIgnoreCase("elastic_user")) {
+ return "elastic";
+ }
+ if (secretKey.equalsIgnoreCase("elastic_secret")) {
+ return "secret";
+ }
+ if (secretKey.equalsIgnoreCase("elastic_host")) {
+ return "localhost";
+ }
+ if (secretKey.equalsIgnoreCase("elastic_port1")) {
+ return "19200";
+ }
+ if (secretKey.equalsIgnoreCase("elastic_port2")) {
+ return "19300";
+ }
+ //Cassandra keys
+ if (secretKey.equalsIgnoreCase("cassandra_user")) {
+ return "cassandra";
+ }
+ if (secretKey.equalsIgnoreCase("cassandra_secret")) {
+ return "secret";
+ }
+ if (secretKey.equalsIgnoreCase("cassandra_host")) {
+ return "localhost";
+ }
+ if (secretKey.equalsIgnoreCase("cassandra_port")) {
+ return "19042";
+ }
+ //Neo4j Keys
+ if (secretKey.equalsIgnoreCase("neo4j_secret")) {
+ return "neo4j123";
+ }
+ if (secretKey.equalsIgnoreCase("neo4j_uri")) {
+ return "bolt://localhost:17687";
+ }
+
+ return "secretVal";
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java
new file mode 100644
index 0000000000..6a246cd9fc
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java
@@ -0,0 +1,32 @@
+package com.baeldung.connectiondetails.configuration;
+
+import com.baeldung.connectiondetails.adapter.VaultAdapter;
+import org.springframework.boot.autoconfigure.cassandra.CassandraConnectionDetails;
+
+import java.util.List;
+
+public class CustomCassandraConnectionDetails implements CassandraConnectionDetails {
+ @Override
+ public List getContactPoints() {
+ Node node = new Node(
+ VaultAdapter.getSecret("cassandra_host"),
+ Integer.parseInt(VaultAdapter.getSecret("cassandra_port"))
+ );
+ return List.of(node);
+ }
+
+ @Override
+ public String getUsername() {
+ return VaultAdapter.getSecret("cassandra_user");
+ }
+
+ @Override
+ public String getPassword() {
+ return VaultAdapter.getSecret("cassandra_secret");
+ }
+
+ @Override
+ public String getLocalDatacenter() {
+ return "datacenter-1";
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java
new file mode 100644
index 0000000000..02ed8c0051
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java
@@ -0,0 +1,17 @@
+package com.baeldung.connectiondetails.configuration;
+
+import org.springframework.boot.autoconfigure.cassandra.CassandraConnectionDetails;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+
+@Configuration(proxyBeanMethods = false)
+@Profile("cassandra")
+public class CustomCassandraConnectionDetailsConfiguration {
+ @Bean
+ @Primary
+ public CassandraConnectionDetails getCustomCassandraConnectionDetails() {
+ return new CustomCassandraConnectionDetails();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java
new file mode 100644
index 0000000000..0b45878bc9
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java
@@ -0,0 +1,29 @@
+package com.baeldung.connectiondetails.configuration;
+
+import com.baeldung.connectiondetails.adapter.VaultAdapter;
+import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails;
+
+import java.util.List;
+
+public class CustomElasticsearchConnectionDetails implements ElasticsearchConnectionDetails {
+ @Override
+ public List getNodes() {
+ Node node1 = new Node(
+ VaultAdapter.getSecret("elastic_host"),
+ Integer.parseInt(VaultAdapter.getSecret("elastic_port1")),
+ Node.Protocol.HTTP
+ );
+ return List.of(node1);
+ }
+
+ @Override
+ public String getUsername() {
+ return VaultAdapter.getSecret("elastic_user");
+ }
+
+ @Override
+ public String getPassword() {
+ return VaultAdapter.getSecret("elastic_secret");
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java
new file mode 100644
index 0000000000..a9b3da44fa
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java
@@ -0,0 +1,17 @@
+package com.baeldung.connectiondetails.configuration;
+
+import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+
+@Configuration(proxyBeanMethods = false)
+@Profile("elastic")
+public class CustomElasticsearchConnectionDetailsConfiguration {
+ @Bean
+ @Primary
+ public ElasticsearchConnectionDetails getCustomElasticConnectionDetails() {
+ return new CustomElasticsearchConnectionDetails();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java
new file mode 100644
index 0000000000..c0412fbb21
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java
@@ -0,0 +1,24 @@
+package com.baeldung.connectiondetails.configuration;
+
+import com.baeldung.connectiondetails.adapter.VaultAdapter;
+import org.neo4j.driver.AuthToken;
+import org.neo4j.driver.AuthTokens;
+import org.springframework.boot.autoconfigure.neo4j.Neo4jConnectionDetails;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class CustomNeo4jConnectionDetails implements Neo4jConnectionDetails {
+ @Override
+ public URI getUri() {
+ try {
+ return new URI(VaultAdapter.getSecret("neo4j_uri"));
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ @Override
+ public AuthToken getAuthToken() {
+ return AuthTokens.basic("neo4j", VaultAdapter.getSecret("neo4j_secret"));
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java
new file mode 100644
index 0000000000..aec8908c7d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java
@@ -0,0 +1,17 @@
+package com.baeldung.connectiondetails.configuration;
+
+import org.springframework.boot.autoconfigure.neo4j.Neo4jConnectionDetails;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+
+@Configuration(proxyBeanMethods = false)
+@Profile("neo4j")
+public class CustomNeo4jConnectionDetailsConfiguration {
+ @Bean
+ @Primary
+ public Neo4jConnectionDetails getNeo4jConnectionDetails() {
+ return new CustomNeo4jConnectionDetails();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java
new file mode 100644
index 0000000000..3387356366
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java
@@ -0,0 +1,17 @@
+package com.baeldung.connectiondetails.configuration;
+
+import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+
+@Configuration(proxyBeanMethods = false)
+@Profile("jdbc")
+public class JdbcConnectionDetailsConfiguration {
+ @Bean
+ @Primary
+ public JdbcConnectionDetails getPostgresConnection() {
+ return new PostgresConnectionDetails();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java
new file mode 100644
index 0000000000..df689d81b6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java
@@ -0,0 +1,14 @@
+package com.baeldung.connectiondetails.configuration;
+
+
+import com.baeldung.connectiondetails.adapter.VaultAdapter;
+import com.mongodb.ConnectionString;
+import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails;
+
+public class MongoDBConnectionDetails implements MongoConnectionDetails {
+ @Override
+ public ConnectionString getConnectionString() {
+ return new ConnectionString(VaultAdapter.getSecret("mongo_connection_string"));
+ }
+}
+
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java
new file mode 100644
index 0000000000..d455991d08
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java
@@ -0,0 +1,17 @@
+package com.baeldung.connectiondetails.configuration;
+
+import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+
+@Configuration(proxyBeanMethods = false)
+@Profile("mongo")
+public class MongoDBConnectionDetailsConfiguration {
+ @Bean
+ @Primary
+ public MongoConnectionDetails getMongoConnectionDetails() {
+ return new MongoDBConnectionDetails();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java
new file mode 100644
index 0000000000..c9b213a8d3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java
@@ -0,0 +1,21 @@
+package com.baeldung.connectiondetails.configuration;
+
+import com.baeldung.connectiondetails.adapter.VaultAdapter;
+import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails;
+
+public class PostgresConnectionDetails implements JdbcConnectionDetails {
+ @Override
+ public String getUsername() {
+ return VaultAdapter.getSecret("postgres_user_key");
+ }
+
+ @Override
+ public String getPassword() {
+ return VaultAdapter.getSecret("postgres_secret_key");
+ }
+
+ @Override
+ public String getJdbcUrl() {
+ return VaultAdapter.getSecret("postgres_jdbc_url");
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java
new file mode 100644
index 0000000000..4ce6abc9d5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java
@@ -0,0 +1,22 @@
+package com.baeldung.connectiondetails.configuration;
+
+import com.baeldung.connectiondetails.adapter.VaultAdapter;
+import io.r2dbc.spi.ConnectionFactoryOptions;
+import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails;
+
+public class R2dbcPostgresConnectionDetails implements R2dbcConnectionDetails {
+ @Override
+ public ConnectionFactoryOptions getConnectionFactoryOptions() {
+
+ ConnectionFactoryOptions options = ConnectionFactoryOptions.builder()
+ .option(ConnectionFactoryOptions.DRIVER, "postgresql")
+ .option(ConnectionFactoryOptions.HOST, VaultAdapter.getSecret("r2dbc_postgres_host"))
+ .option(ConnectionFactoryOptions.PORT, Integer.valueOf(VaultAdapter.getSecret("r2dbc_postgres_port")))
+ .option(ConnectionFactoryOptions.USER, VaultAdapter.getSecret("r2dbc_postgres_user"))
+ .option(ConnectionFactoryOptions.PASSWORD, VaultAdapter.getSecret("r2dbc_postgres_secret"))
+ .option(ConnectionFactoryOptions.DATABASE, VaultAdapter.getSecret("r2dbc_postgres_database"))
+ .build();
+
+ return options;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java
new file mode 100644
index 0000000000..144355dce4
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java
@@ -0,0 +1,17 @@
+package com.baeldung.connectiondetails.configuration;
+
+import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+
+@Configuration(proxyBeanMethods = false)
+@Profile("r2dbc")
+public class R2dbcPostgresConnectionDetailsConfiguration {
+ @Bean
+ @Primary
+ public R2dbcConnectionDetails getR2dbcPostgresConnectionDetails() {
+ return new R2dbcPostgresConnectionDetails();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java
new file mode 100644
index 0000000000..9dc4bdf33b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java
@@ -0,0 +1,34 @@
+package com.baeldung.connectiondetails.configuration;
+
+import com.baeldung.connectiondetails.adapter.VaultAdapter;
+import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails;
+
+import java.util.List;
+
+public class RabbitMQConnectionDetails implements RabbitConnectionDetails {
+ @Override
+ public String getUsername() {
+ return VaultAdapter.getSecret("rabbitmq_username");
+ }
+
+ @Override
+ public String getPassword() {
+ return VaultAdapter.getSecret("rabbitmq_password");
+ }
+
+ @Override
+ public String getVirtualHost() {
+ return "/";
+ }
+
+ @Override
+ public List getAddresses() {
+ return List.of(this.getFirstAddress());
+ }
+
+ @Override
+ public Address getFirstAddress() {
+ return new Address(VaultAdapter.getSecret("rabbitmq_host"),
+ Integer.parseInt(VaultAdapter.getSecret("rabbitmq_port")));
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java
new file mode 100644
index 0000000000..237bec3fc4
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java
@@ -0,0 +1,17 @@
+package com.baeldung.connectiondetails.configuration;
+
+import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+
+@Configuration(proxyBeanMethods = false)
+@Profile("rabbitmq")
+public class RabbitMQConnectionDetailsConfiguration {
+ @Primary
+ @Bean
+ public RabbitConnectionDetails getRabbitmqConnection() {
+ return new RabbitMQConnectionDetails();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java
new file mode 100644
index 0000000000..9485f22240
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java
@@ -0,0 +1,26 @@
+package com.baeldung.connectiondetails.configuration;
+
+import com.baeldung.connectiondetails.adapter.VaultAdapter;
+import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails;
+
+public class RedisCacheConnectionDetails implements RedisConnectionDetails {
+ @Override
+ public String getPassword() {
+ return VaultAdapter.getSecret("redis_password");
+ }
+
+ @Override
+ public Standalone getStandalone() {
+ return new Standalone() {
+ @Override
+ public String getHost() {
+ return VaultAdapter.getSecret("redis_host");
+ }
+
+ @Override
+ public int getPort() {
+ return Integer.parseInt(VaultAdapter.getSecret("redis_port"));
+ }
+ };
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java
new file mode 100644
index 0000000000..31816ff0b4
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java
@@ -0,0 +1,17 @@
+package com.baeldung.connectiondetails.configuration;
+
+import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+
+@Configuration(proxyBeanMethods = false)
+@Profile("redis")
+public class RedisConnectionDetailsConfiguration {
+ @Bean
+ @Primary
+ public RedisConnectionDetails getRedisCacheConnection() {
+ return new RedisCacheConnectionDetails();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java
new file mode 100644
index 0000000000..851dbb7c90
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java
@@ -0,0 +1,27 @@
+package com.baeldung.connectiondetails.entity.elastic;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.elasticsearch.annotations.Document;
+
+@Document(indexName = "person")
+public class Person {
+ String name;
+ @Id
+ String ssn;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSsn() {
+ return ssn;
+ }
+
+ public void setSsn(String ssn) {
+ this.ssn = ssn;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java
new file mode 100644
index 0000000000..63e88d0a41
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java
@@ -0,0 +1,27 @@
+package com.baeldung.connectiondetails.entity.neo4j;
+
+import org.springframework.data.neo4j.core.schema.Id;
+import org.springframework.data.neo4j.core.schema.Node;
+
+@Node
+public class Person {
+ @Id
+ String name;
+ String zipcode;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getZipcode() {
+ return zipcode;
+ }
+
+ public void setZipcode(String zipcode) {
+ this.zipcode = zipcode;
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/application-docker-compose.yml b/spring-boot-modules/spring-boot-3/src/main/resources/application-docker-compose.yml
deleted file mode 100644
index bce67fa400..0000000000
--- a/spring-boot-modules/spring-boot-3/src/main/resources/application-docker-compose.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-spring:
- docker:
- compose:
- enabled: true
- file: docker-compose.yml
- autoconfigure:
- exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml
index 3885e59a61..b1e79ca17e 100644
--- a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml
@@ -19,7 +19,7 @@ spring:
compose:
enabled: false
autoconfigure:
- exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
+ exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
cors:
allow:
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties
new file mode 100644
index 0000000000..ea2619bada
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties
@@ -0,0 +1,11 @@
+spring.docker.compose.enabled=true
+spring.docker.compose.file=./connectiondetails/docker-compose-cassandra.yml
+spring.docker.compose.skip.in-tests=false
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.mustache.check-template-location=false
+spring.profiles.active=cassandra
+spring.cassandra.local-datacenter=dc1
+#spring.cassandra.keyspace-name=spring_cassandra
+#spring.cassandra.schema-action=CREATE_IF_NOT_EXISTS
+spring.data.cassandra.request.timeout=20000 # Set your desired timeout in milliseconds
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties
new file mode 100644
index 0000000000..e9f32c252b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties
@@ -0,0 +1,7 @@
+spring.docker.compose.enabled=true
+spring.docker.compose.file=./connectiondetails/docker-compose-elastic.yml
+spring.docker.compose.skip.in-tests=false
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.mustache.check-template-location=false
+spring.profiles.active=elastic
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties
new file mode 100644
index 0000000000..40f9d1fd68
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties
@@ -0,0 +1,7 @@
+spring.docker.compose.enabled=true
+spring.docker.compose.file=./connectiondetails/docker-compose-jdbc.yml
+spring.docker.compose.skip.in-tests=false
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.mustache.check-template-location=false
+spring.profiles.active=jdbc
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties
new file mode 100644
index 0000000000..4dd355bbed
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties
@@ -0,0 +1,8 @@
+spring.docker.compose.enabled=true
+spring.docker.compose.file=./connectiondetails/docker-compose-mongo.yml
+spring.docker.compose.skip.in-tests=false
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.mustache.check-template-location=false
+spring.profiles.active=mongo
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
+spring.data.mongodb.database=demodb
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties
new file mode 100644
index 0000000000..9e6c9c0f11
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties
@@ -0,0 +1,7 @@
+spring.docker.compose.enabled=true
+spring.docker.compose.file=./connectiondetails/docker-compose-neo4j.yml
+spring.docker.compose.skip.in-tests=false
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.mustache.check-template-location=false
+spring.profiles.active=neo4j
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties
new file mode 100644
index 0000000000..91d2fba818
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties
@@ -0,0 +1,7 @@
+spring.docker.compose.enabled=true
+spring.docker.compose.file=./connectiondetails/docker-compose-jdbc.yml
+spring.docker.compose.skip.in-tests=false
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.mustache.check-template-location=false
+spring.profiles.active=r2dbc
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties
new file mode 100644
index 0000000000..fe9bfa3ecb
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties
@@ -0,0 +1,7 @@
+spring.docker.compose.enabled=true
+spring.docker.compose.file=./connectiondetails/docker-compose-rabbitmq.yml
+spring.docker.compose.skip.in-tests=false
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.mustache.check-template-location=false
+spring.profiles.active=rabbitmq
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties
new file mode 100644
index 0000000000..9e4973164e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties
@@ -0,0 +1,7 @@
+spring.docker.compose.enabled=true
+spring.docker.compose.file=./connectiondetails/docker-compose-redis.yml
+spring.docker.compose.skip.in-tests=false
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.mustache.check-template-location=false
+spring.profiles.active=redis
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml
new file mode 100644
index 0000000000..339f658e1a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml
@@ -0,0 +1,27 @@
+@startuml
+'https://plantuml.com/class-diagram
+
+interface CassandraConnectionDetails {
+ +getUsername():String
+ +getPassword():String
+ +getContactPoints():List
+ +getLocalDatacenter():String
+}
+class CustomCassandraConnectionDetails {
+ +getUsername():String
+ +getPassword():String
+ +getContactPoints():List
+ +getLocalDatacenter():String
+}
+class VaultAdapter {
+ +getSecret(String secretKey):String
+}
+class CustomCassandraConnectionDetailsConfiguration {
+ +getCustomCassandraConnectionDetails():CassandraConnectionDetails
+}
+CustomCassandraConnectionDetails -left-> VaultAdapter:uses
+CustomCassandraConnectionDetails -right-|> CassandraConnectionDetails : implements
+CustomCassandraConnectionDetailsConfiguration -up-> CustomCassandraConnectionDetails:uses
+
+
+@enduml
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml
new file mode 100644
index 0000000000..a2a917eea0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml
@@ -0,0 +1,16 @@
+@startuml
+'https://plantuml.com/sequence-diagram
+skinparam sequenceMessageAlign direction
+skinparam handwritten true
+skinparam sequence {
+ParticipantBackgroundColor beige
+ParticipantPadding 50
+}
+autonumber
+
+"Spring Boot" -[#63b175]> "Hashicorp Vault": Secret Request
+"Hashicorp Vault" -[#63b175]-> "Spring Boot": Secret Response
+"Spring Boot" -[#63b175]> "Remote Service": Connection Request
+
+"Remote Service" -[#63b175]-> "Spring Boot": Connection Response
+@enduml
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml
new file mode 100644
index 0000000000..c593cbc73b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml
@@ -0,0 +1,9 @@
+version: '3.8'
+services:
+ cassandra:
+ image: 'cassandra:latest'
+ environment:
+ - 'CASSANDRA_DC=datacenter-1'
+ - 'CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch'
+ ports:
+ - '19042:9042'
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml
new file mode 100644
index 0000000000..a6e51ee1a0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml
@@ -0,0 +1,12 @@
+version: '3.8'
+services:
+ elasticsearch:
+ image: 'docker.elastic.co/elasticsearch/elasticsearch:7.17.10'
+ environment:
+ - 'ELASTIC_USERNAME=elastic'
+ - 'ELASTIC_PASSWORD=secret'
+ - 'discovery.type=single-node'
+ - 'xpack.security.enabled=false'
+ ports:
+ - '19200:9200'
+# - '19300:9300'
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml
new file mode 100644
index 0000000000..65a8f135e8
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml
@@ -0,0 +1,10 @@
+version: '3.8'
+services:
+ database:
+ image: 'postgres:13.1-alpine'
+ ports:
+ - '15432:5432'
+ environment:
+ - 'POSTGRES_USER=postgres'
+ - 'POSTGRES_DB=postgresdb'
+ - 'POSTGRES_PASSWORD=postgres'
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml
new file mode 100644
index 0000000000..f12f5c3aa7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml
@@ -0,0 +1,10 @@
+version: '3.8'
+services:
+ mongodb:
+ image: 'mongo:latest'
+ environment:
+ - 'MONGO_INITDB_DATABASE=demodb'
+# - 'MONGO_INITDB_ROOT_PASSWORD=Mongo123'
+# - 'MONGO_INITDB_ROOT_USERNAME=mongouser'
+ ports:
+ - '27017:27017'
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml
new file mode 100644
index 0000000000..611951e755
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml
@@ -0,0 +1,8 @@
+version: '3.8'
+services:
+ neo4j:
+ image: 'neo4j:latest'
+ ports:
+ - '17687:7687'
+ environment:
+ NEO4J_AUTH: neo4j/neo4j123
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml
new file mode 100644
index 0000000000..8abf19bd19
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml
@@ -0,0 +1,9 @@
+version: '3.8'
+services:
+ rabbitmq:
+ image: 'rabbitmq:latest'
+ environment:
+ - 'RABBITMQ_DEFAULT_PASS=rabbitmq'
+ - 'RABBITMQ_DEFAULT_USER=rabbitmquser'
+ ports:
+ - '5672:5672'
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml
new file mode 100644
index 0000000000..c218cef998
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml
@@ -0,0 +1,8 @@
+version: '3.8'
+services:
+ redis:
+ image: 'redis:latest'
+ ports:
+ - '6379:6379'
+ environment:
+ - 'REDIS_REQUIREPASS=redis'
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml
new file mode 100644
index 0000000000..4d2bded9eb
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml
@@ -0,0 +1,39 @@
+version: '3.8'
+services:
+ database:
+ profiles:
+ - 'jdbc'
+ image: 'postgres:13.1-alpine'
+ ports:
+ - '15432:5432'
+ environment:
+ - 'POSTGRES_USER=postgres'
+ - 'POSTGRES_DB=postgresdb'
+ - 'POSTGRES_PASSWORD=postgres'
+ rabbitmq:
+ profiles:
+ - 'rabbitmq'
+ image: 'rabbitmq:latest'
+ environment:
+ - 'RABBITMQ_DEFAULT_PASS=rabbitmq'
+ - 'RABBITMQ_DEFAULT_USER=rabbitmquser'
+ ports:
+ - '5672:5672'
+ redis:
+ profiles:
+ - 'redis'
+ image: 'redis:latest'
+ ports:
+ - '6379:6379'
+ environment:
+ - 'REDIS_REQUIREPASS=redis'
+# mongodb:
+# profiles:
+# - 'mongo-test'
+# image: 'mongo:latest'
+# environment:
+# - 'MONGO_INITDB_DATABASE=demodb'
+# - 'MONGO_INITDB_ROOT_PASSWORD=mongo'
+# - 'MONGO_INITDB_ROOT_USERNAME=mongouser'
+# ports:
+# - '27017:27017'
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml
new file mode 100644
index 0000000000..48db0bcc4f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml
@@ -0,0 +1,25 @@
+@startuml
+'https://plantuml.com/class-diagram
+
+interface ElasticsearchConnectionDetails {
+ +getUsername():String
+ +getPassword():String
+ +getNodes():List
+}
+class CustomElasticsearchConnectionDetails {
+ +getUsername():String
+ +getPassword():String
+ +getNodes():List
+}
+class VaultAdapter {
+ +getSecret(String secretKey):String
+}
+class CustomElasticsearchConnectionDetailsConfiguration {
+ +getCustomElasticConnectionDetails():ElasticsearchConnectionDetails
+}
+CustomElasticsearchConnectionDetails -left-> VaultAdapter:uses
+CustomElasticsearchConnectionDetails -right-|> ElasticsearchConnectionDetails : implements
+CustomElasticsearchConnectionDetailsConfiguration -up-> CustomElasticsearchConnectionDetails:uses
+
+
+@enduml
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml
new file mode 100644
index 0000000000..88de5d607f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml
@@ -0,0 +1,25 @@
+@startuml
+'https://plantuml.com/class-diagram
+
+interface JdbcConnectionDetails {
+ +getUsername():String
+ +getPassword():String
+ +getJdbcUrl():String
+}
+class PostgresConnectionDetails {
+ +getUsername():String
+ +getPassword():String
+ +getJdbcUrl():String
+}
+class VaultAdapter {
+ +getSecret(String secretKey):String
+}
+class JdbcConnectonDetailsConfiguration {
+ +getPostgresConnection():JdbcConnectionDetails
+}
+PostgresConnectionDetails -left-> VaultAdapter:uses
+PostgresConnectionDetails -right-|> JdbcConnectionDetails : implements
+JdbcConnectonDetailsConfiguration -up-> PostgresConnectionDetails:uses
+
+
+@enduml
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml
new file mode 100644
index 0000000000..974c6de601
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml
@@ -0,0 +1,19 @@
+@startuml
+'https://plantuml.com/class-diagram
+
+interface MongoConnectionDetails {
+ getConnectionString():ConnectionString
+}
+class MongoDBConnectionDetails {
+ getConnectionString():ConnectionString
+}
+class VaultAdapter {
+ +getSecret(String secretKey):String
+}
+class MongoDBConnectionDetailsConfiguration {
+ +getMongoConnectionDetails() : MongoConnectionDetails
+}
+MongoDBConnectionDetails -left-> VaultAdapter:uses
+MongoDBConnectionDetails -right-|> MongoConnectionDetails : implements
+MongoDBConnectionDetailsConfiguration -up-> MongoDBConnectionDetails:uses
+@enduml
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml
new file mode 100644
index 0000000000..ec69587ab9
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml
@@ -0,0 +1,21 @@
+@startuml
+'https://plantuml.com/class-diagram
+
+interface R2dbcConnectionDetails {
+ +getConnectionFactoryOptions():ConnectionFactoryOptions
+}
+class R2dbcPostgresConnectionDetails {
+ +getConnectionFactoryOptions():ConnectionFactoryOptions
+}
+class VaultAdapter {
+ +getSecret(String secretKey):String
+}
+class R2dbcPostgresConnectionDetailsConfiguration {
+ +getR2dbcPostgresConnectionDetails():R2dbcConnectionDetails
+}
+R2dbcPostgresConnectionDetails -right-> VaultAdapter:uses
+R2dbcPostgresConnectionDetails -up-|> R2dbcConnectionDetails:implements
+R2dbcPostgresConnectionDetailsConfiguration -up-> R2dbcPostgresConnectionDetails:uses
+
+
+@enduml
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml
new file mode 100644
index 0000000000..0541e12915
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml
@@ -0,0 +1,27 @@
+@startuml
+'https://plantuml.com/class-diagram
+
+interface RabbitConnectionDetails {
+ +getUsername():String
+ +getPassword():String
+ +getFirstAddress():Address
+ +getAddresses():List
+}
+class RabbitMQConnectionDetails {
+ +getUsername():String
+ +getPassword():String
+ +getFirstAddress():Address
+ +getAddresses():List
+}
+class VaultAdapter {
+ +getSecret(String secretKey):String
+}
+class RabbitMQConnectionDetailsConfiguration {
+ +getRabbitmqConnection() : RabbitConnectionDetails
+}
+RabbitMQConnectionDetails -left-> VaultAdapter:uses
+RabbitMQConnectionDetails -right-|> RabbitConnectionDetails : implements
+RabbitMQConnectionDetailsConfiguration -up-> RabbitMQConnectionDetails:uses
+
+
+@enduml
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml
new file mode 100644
index 0000000000..a18c83a8be
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml
@@ -0,0 +1,23 @@
+@startuml
+'https://plantuml.com/class-diagram
+
+interface RedisConnectionDetails {
+ +getPassword():String
+ +getStandalone():Standalone
+}
+class RedisCacheConnectionDetails {
+ +getPassword():String
+ +getStandalone():Standalone
+}
+class VaultAdapter {
+ +getSecret(String secretKey):String
+}
+class RedisConnectonDetailsConfiguration {
+ +getRedisCacheConnection():RedisConnectionDetails
+}
+RedisCacheConnectionDetails -left-> VaultAdapter:uses
+RedisCacheConnectionDetails -right-|> RedisConnectionDetails : implements
+RedisConnectonDetailsConfiguration -up-> RedisCacheConnectionDetails:uses
+
+
+@enduml
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java
new file mode 100644
index 0000000000..6380f6375f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.connectiondetails;
+
+import com.baeldung.connectiondetails.configuration.CustomCassandraConnectionDetailsConfiguration;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.cassandra.core.CassandraTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ConnectionDetailsApplication.class)
+@Import(CustomCassandraConnectionDetailsConfiguration.class)
+@ComponentScan(basePackages = "com.baeldung.connectiondetails")
+@TestPropertySource(locations = {"classpath:connectiondetails/application-cassandra.properties"})
+@ActiveProfiles("cassandra")
+public class CassandraConnectionDetailsIntegrationTest {
+ private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsIntegrationTest.class);
+ @Autowired
+ private CassandraTemplate cassandraTemplate;
+ @Test
+ public void givenHashicorpVault_whenRunQuery_thenSuccess() {
+ Boolean result = cassandraTemplate.getCqlOperations()
+ .execute("CREATE KEYSPACE IF NOT EXISTS spring_cassandra"
+ + " WITH replication = {'class':'SimpleStrategy', 'replication_factor':3}");
+ logger.info("the result -" + result);
+ assertTrue(result);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java
new file mode 100644
index 0000000000..ad4110c7e5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java
@@ -0,0 +1,45 @@
+package com.baeldung.connectiondetails;
+
+import com.baeldung.connectiondetails.configuration.CustomElasticsearchConnectionDetailsConfiguration;
+import com.baeldung.connectiondetails.entity.elastic.Person;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ConnectionDetailsApplication.class)
+@Import(CustomElasticsearchConnectionDetailsConfiguration.class)
+@ComponentScan(basePackages = "com.baeldung.connectiondetails")
+@TestPropertySource(locations = {"classpath:connectiondetails/application-elastic.properties"})
+@ActiveProfiles("elastic")
+public class ElasticsearchConnectionDetailsIntegrationTest {
+ private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsIntegrationTest.class);
+ @Autowired
+ private ElasticsearchTemplate elasticsearchTemplate;
+
+ @Before
+ public void prepare() {
+ if (elasticsearchTemplate.indexOps(Person.class).exists()) {
+ elasticsearchTemplate.indexOps(Person.class).delete();
+ }
+ }
+ @Test
+ public void givenHashicorpVault_whenCreateIndexInElastic_thenSuccess() {
+
+ Boolean result = elasticsearchTemplate.indexOps(Person.class).create();
+ logger.info("index created:" + result);
+ assertTrue(result);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java
new file mode 100644
index 0000000000..748bc27b0b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.connectiondetails;
+
+import com.baeldung.connectiondetails.configuration.JdbcConnectionDetailsConfiguration;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.sql.Date;
+import java.time.LocalDate;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ConnectionDetailsApplication.class)
+@Import(JdbcConnectionDetailsConfiguration.class)
+@ComponentScan(basePackages = "com.baeldung.connectiondetails")
+@TestPropertySource(locations = {"classpath:connectiondetails/application-jdbc.properties"})
+@ActiveProfiles("jdbc")
+public class JdbcConnectionDetailsIntegrationTest {
+ private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsIntegrationTest.class);
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+ @Test
+ public void givenSecretVault_whenIntegrateWithPostgres_thenConnectionSuccessful() {
+ String sql = "select current_date;";
+ Date date = jdbcTemplate.queryForObject(sql, Date.class);
+ assertEquals(LocalDate.now().toString(), date.toString());
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java
new file mode 100644
index 0000000000..edd6da3448
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.connectiondetails;
+
+import com.baeldung.connectiondetails.configuration.MongoDBConnectionDetailsConfiguration;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration;
+import org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ConnectionDetailsApplication.class)
+@Import(MongoDBConnectionDetailsConfiguration.class)
+@ComponentScan(basePackages = "com.baeldung.connectiondetails")
+@TestPropertySource(locations = {"classpath:connectiondetails/application-mongo.properties"})
+@ActiveProfiles("mongo")
+public class MongoDBConnectionDetailsIntegrationTest {
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+ @Test
+ public void givenMongoDB_whenExecuteQuery_ReturnResult() throws JSONException {
+ mongoTemplate.insert("{\"msg\":\"My First Entry in MongoDB\"}", "myDemoCollection");
+ String result = mongoTemplate.find(new Query(), String.class, "myDemoCollection").get(0);
+
+ JSONObject jsonObject = new JSONObject(result);
+ result = jsonObject.get("msg").toString();
+ R2dbcAutoConfiguration r2dbcAutoConfiguration;
+ R2dbcDataAutoConfiguration r2dbcDataAutoConfiguration;
+ R2dbcRepositoriesAutoConfiguration r2dbcRepositoriesAutoConfiguration;
+
+ assertEquals("My First Entry in MongoDB", result);
+ }
+}
+
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java
new file mode 100644
index 0000000000..88a9529822
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.connectiondetails;
+
+import com.baeldung.connectiondetails.configuration.CustomNeo4jConnectionDetailsConfiguration;
+import com.baeldung.connectiondetails.entity.neo4j.Person;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.neo4j.core.Neo4jTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ConnectionDetailsApplication.class)
+@Import(CustomNeo4jConnectionDetailsConfiguration.class)
+@ComponentScan(basePackages = "com.baeldung.connectiondetails")
+@TestPropertySource(locations = {"classpath:connectiondetails/application-neo4j.properties"})
+@ActiveProfiles("neo4j")
+public class Neo4jConnectionDetailsIntegrationTest {
+ @Autowired
+ private Neo4jTemplate neo4jTemplate;
+
+ @After
+ public void cleanup() {
+ neo4jTemplate.deleteAll(Person.class);
+ }
+ @Test
+ public void giveHashicorpVault_whenRunQuery_thenSuccess() {
+ Person person = new Person();
+ person.setName("James");
+ person.setZipcode("751003");
+
+ Person data = neo4jTemplate.save(person);
+ assertEquals("James", data.getName());
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java
new file mode 100644
index 0000000000..b24071a1f1
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.connectiondetails;
+
+import com.baeldung.connectiondetails.configuration.R2dbcPostgresConnectionDetailsConfiguration;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ConnectionDetailsApplication.class)
+@Import(R2dbcPostgresConnectionDetailsConfiguration.class)
+@TestPropertySource(locations = {"classpath:connectiondetails/application-r2dbc.properties"})
+@ActiveProfiles("r2dbc")
+public class R2dbcConnectionDetailsIntegrationTest {
+ Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsIntegrationTest.class);
+ @Autowired
+ private R2dbcEntityTemplate r2dbcEntityTemplate;
+
+ @Test
+ public void givenHashicorpVault_whenQueryPostgresReactive_thenSuccess() {
+
+ String sql = "select * from information_schema.tables";
+
+ List result = r2dbcEntityTemplate.getDatabaseClient().sql(sql).fetch().all()
+ .map(r -> {
+ return "hello " + r.get("table_name").toString();
+
+ }).collectList().block();
+ logger.info("count ------" + result.size());
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java
new file mode 100644
index 0000000000..2793ac0126
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.connectiondetails;
+
+import com.baeldung.connectiondetails.configuration.RabbitMQConnectionDetailsConfiguration;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
+import org.springframework.amqp.rabbit.core.RabbitAdmin;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ConnectionDetailsApplication.class)
+@Import(RabbitMQConnectionDetailsConfiguration.class)
+@TestPropertySource(locations = {"classpath:connectiondetails/application-rabbitmq.properties"})
+@ActiveProfiles("rabbitmq")
+public class RabbitmqConnectionDetailsIntegrationTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsIntegrationTest.class);
+
+ @Autowired
+ private RabbitTemplate rabbitTemplate;
+
+ @Autowired
+ private CachingConnectionFactory connectionFactory;
+
+ private final static String queueName = "Test_Queue";
+
+ RabbitAdmin rabbitAdmin;
+
+ @Before
+ public void setup() {
+ logger.info("create new queue");
+ rabbitAdmin = new RabbitAdmin(connectionFactory);
+ logger.info("creating queue: " + rabbitAdmin.declareQueue(new Queue(queueName)));
+ connectionFactory.destroy();
+ }
+
+ @After
+ public void cleanup() {
+ logger.info("delete queue");
+ this.rabbitAdmin.deleteQueue(queueName, false, true);
+ }
+ @Test
+ public void givenRabbitmq_whenPublishMessage_thenSuccess() {
+ logger.info("sending message to queue " + queueName);
+ final String MSG = "this is a test message";
+ this.rabbitTemplate.convertAndSend(queueName, MSG);
+ assertEquals(MSG, this.rabbitTemplate.receiveAndConvert(queueName));
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java
new file mode 100644
index 0000000000..6ca963a261
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.connectiondetails;
+
+import com.baeldung.connectiondetails.configuration.RedisConnectionDetailsConfiguration;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ConnectionDetailsApplication.class)
+@Import(RedisConnectionDetailsConfiguration.class)
+@TestPropertySource(locations = {"classpath:connectiondetails/application-redis.properties"})
+@ActiveProfiles("redis")
+public class RedisCacheConnnectionDetailsIntegrationTest {
+ private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsIntegrationTest.class);
+
+ @Autowired
+ RedisTemplate redisTemplate;
+
+ @Test
+ public void giveRedisCache_whenKeyVal_storeInCache() {
+ redisTemplate.opsForValue().set("City", "New York");
+ assertEquals("New York", redisTemplate.opsForValue().get("City"));
+ }
+}