Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 27 additions & 12 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<groupId>com.avides.springboot.springtainer</groupId>
<artifactId>springtainer-example</artifactId>
<version>1.0.0</version>
<version>2.0.0-RC1</version>

<name>springtainer-example</name>
<description>Runnable example application demonstrating all springtainer embedded test containers together</description>
Expand All @@ -28,22 +28,22 @@
<properties>
<!-- System -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>21</java.version>
<java.version>25</java.version>
<!-- Build -->
<maven-compiler-plugin.version>3.15.0</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.5.6</maven-surefire-plugin.version>
<maven-failsafe-plugin.version>3.5.6</maven-failsafe-plugin.version>
<maven-enforcer-plugin.version>3.6.3</maven-enforcer-plugin.version>
<!-- Spring -->
<spring-boot.version>3.5.16</spring-boot.version>
<spring-boot.version>4.1.0</spring-boot.version>
<!-- Other -->
<springtainer-rabbitmq.version>2.0.0</springtainer-rabbitmq.version>
<springtainer-mysql.version>2.0.0</springtainer-mysql.version>
<springtainer-mongodb.version>2.0.0</springtainer-mongodb.version>
<springtainer-redis.version>2.0.0</springtainer-redis.version>
<springtainer-elasticsearch.version>3.0.0</springtainer-elasticsearch.version>
<springtainer-mockserver.version>2.0.0</springtainer-mockserver.version>
<springtainer-awss3mock.version>3.0.0</springtainer-awss3mock.version>
<springtainer-rabbitmq.version>3.0.0-RC1</springtainer-rabbitmq.version>
<springtainer-mysql.version>3.0.0-RC1</springtainer-mysql.version>
<springtainer-mongodb.version>3.0.0-RC1</springtainer-mongodb.version>
<springtainer-redis.version>3.0.0-RC1</springtainer-redis.version>
<springtainer-elasticsearch.version>4.0.0-RC1</springtainer-elasticsearch.version>
<springtainer-mockserver.version>3.0.0-RC1</springtainer-mockserver.version>
<springtainer-awss3mock.version>4.0.0-RC1</springtainer-awss3mock.version>
<s3.version>2.46.18</s3.version>
<lombok.version>1.18.46</lombok.version>
<!-- Testing -->
Expand Down Expand Up @@ -139,8 +139,12 @@
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
</dependency>
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-rest5-client</artifactId>
</dependency>

<!-- Testing -->
Expand All @@ -149,6 +153,16 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-restclient</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-resttestclient</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
Expand Down Expand Up @@ -177,6 +191,7 @@
<configuration>
<release>${java.version}</release>
<parameters>true</parameters>
<proc>full</proc>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.avides.springboot.springtainer.example.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.apache.hc.core5.http.HttpHost;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchClients;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.Jackson3JsonpMapper;
import co.elastic.clients.transport.rest5_client.Rest5ClientTransport;
import co.elastic.clients.transport.rest5_client.low_level.Rest5Client;

@Configuration
public class ElasticsearchConfig
Expand All @@ -20,10 +21,9 @@ public class ElasticsearchConfig

@SuppressWarnings("resource")
@Bean
public ElasticsearchOperations elasticsearchOperations()
public ElasticsearchClient elasticsearchClient()
{
var restClient = RestClient.builder(new HttpHost(host, port)).build();
var client = ElasticsearchClients.createImperative(restClient);
return new ElasticsearchTemplate(client);
var restClient = Rest5Client.builder(new HttpHost(host, port)).build();
return new ElasticsearchClient(new Rest5ClientTransport(restClient, new Jackson3JsonpMapper()));
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package com.avides.springboot.springtainer.example.product;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Document(indexName = "products")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ProductDocument
{
@Id
public static final String INDEX = "products";

private String id;

private String name;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,40 @@
package com.avides.springboot.springtainer.example.product;

import java.io.IOException;
import java.util.List;

import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.stereotype.Service;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.search.Hit;

import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;

@Service
@RequiredArgsConstructor
public class ProductSearchService
{
private final ElasticsearchOperations elasticsearchOperations;
private final ElasticsearchClient elasticsearchClient;

@SneakyThrows(IOException.class)
public void index(Product product)
{
var document = new ProductDocument(String.valueOf(product.getId()), product.getName(), product.getDescription());
elasticsearchOperations.save(document);
elasticsearchOperations.indexOps(ProductDocument.class).refresh();
var id = String.valueOf(product.getId());
var document = new ProductDocument(id, product.getName(), product.getDescription());

elasticsearchClient.index(request -> request.index(ProductDocument.INDEX).id(id).document(document));
elasticsearchClient.indices().refresh(request -> request.index(ProductDocument.INDEX));
}

@SneakyThrows(IOException.class)
public List<ProductDocument> search(String query)
{
var criteriaQuery = new CriteriaQuery(Criteria.where("name").contains(query));
return elasticsearchOperations.search(criteriaQuery, ProductDocument.class).stream().map(SearchHit::getContent).toList();
var response = elasticsearchClient.search(
request -> request.index(ProductDocument.INDEX)
.query(builder -> builder.wildcard(wildcard -> wildcard.field("name").value("*" + query + "*").caseInsensitive(Boolean.TRUE))),
ProductDocument.class);

return response.hits().hits().stream().map(Hit::source).toList();
}
}
4 changes: 2 additions & 2 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ spring:
sql:
init:
mode: always
mongodb:
uri: mongodb://${embedded.container.mongodb.host}:${embedded.container.mongodb.port}/springtainer-example
data:
mongodb:
uri: mongodb://${embedded.container.mongodb.host}:${embedded.container.mongodb.port}/springtainer-example
redis:
host: ${embedded.container.redis.host}
port: ${embedded.container.redis.port}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.avides.springboot.springtainer.example;

import java.io.IOException;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.resttestclient.TestRestTemplate;
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit.jupiter.SpringExtension;
Expand All @@ -16,12 +18,15 @@
import com.avides.springboot.springtainer.example.config.S3Config;
import com.avides.springboot.springtainer.example.product.ProductDocument;

import co.elastic.clients.elasticsearch.ElasticsearchClient;

import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestRestTemplate
public abstract class AbstractIT
{
@Autowired
Expand All @@ -31,7 +36,7 @@ public abstract class AbstractIT
private JdbcTemplate jdbcTemplate;

@Autowired
private ElasticsearchOperations elasticsearchOperations;
private ElasticsearchClient elasticsearchClient;

@Autowired
private AuditLogRepository auditLogRepository;
Expand All @@ -52,11 +57,10 @@ void cleanupMysql()
}

@AfterEach
void cleanupElasticsearch()
void cleanupElasticsearch() throws IOException
{
var indexOps = elasticsearchOperations.indexOps(ProductDocument.class);
indexOps.delete();
indexOps.create();
elasticsearchClient.indices().delete(request -> request.index(ProductDocument.INDEX).ignoreUnavailable(Boolean.TRUE));
elasticsearchClient.indices().create(request -> request.index(ProductDocument.INDEX));
}

@AfterEach
Expand Down