Update to Spring Boot 3.4.1

This commit updates the following dependencies:

- Spring Boot to 3.4.2-SNAPSHOT
- Spring Cloud 2024.0.1-SNAPSHOT
- Spring Functions Catalog 5.1.0-SNAPSHOT

Also removes these unnecessary version properties:
- spring-cloud-stream.version
- spring-cloud-function.version
- spring-cloud-starters.version

Also removes dependency mgmt for the following:
- testcontainers-bom
- junit-bom
- jakarta-jms-api
- groovy-bom

Resolves #599 #600

* Remove Debezium Avro integration tests

This commit removes the DebeziumSupplierAvroFormatTest as it
relies on a dependency that has been removed in Spring Integration
and stream-applications. We should not need to test Debezium
support for Avro encoding.
This commit is contained in:
Chris Bono
2025-01-09 08:55:23 -06:00
committed by GitHub
parent c241e69237
commit 95550f0448
10 changed files with 31 additions and 245 deletions

View File

@@ -33,19 +33,16 @@
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>elasticsearch</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -32,14 +32,8 @@ import org.testcontainers.utility.DockerImageName;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.fn.consumer.elasticsearch.ElasticsearchConsumerConfiguration;
import org.springframework.cloud.stream.binder.test.InputDestination;
import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration;
import org.springframework.lang.NonNull;
import org.springframework.messaging.support.GenericMessage;
@@ -59,24 +53,20 @@ public class ElasticsearchSinkTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withUserConfiguration(TestChannelBinderConfiguration.getCompleteConfiguration(ElasticsearchSinkTestApplication.class));
@Test
void elasticSearchSinkWithIndexNameProperty() {
this.contextRunner
.withPropertyValues("spring.cloud.function.definition=elasticsearchConsumer",
"elasticsearch.consumer.index=foo", "elasticsearch.consumer.id=1",
"spring.elasticsearch.rest.uris=http://" + elasticsearch.getHttpHostAddress())
"spring.elasticsearch.uris=http://" + elasticsearch.getHttpHostAddress())
.run(context -> {
final InputDestination inputDestination = context.getBean(InputDestination.class);
final String jsonObject = "{\"age\":10,\"dateOfBirth\":1471466076564,"
InputDestination inputDestination = context.getBean(InputDestination.class);
String jsonObject = "{\"age\":10,\"dateOfBirth\":1471466076564,"
+ "\"fullName\":\"John Doe\"}";
inputDestination.send(new GenericMessage<>(jsonObject));
final ElasticsearchClient elasticsearchClient = context.getBean(ElasticsearchClient.class);
final GetRequest getRequest = new GetRequest.Builder().index("foo").id("1").build();
final GetResponse<JsonData> response = elasticsearchClient.get(getRequest, JsonData.class);
ElasticsearchClient elasticsearchClient = context.getBean(ElasticsearchClient.class);
GetRequest getRequest = new GetRequest.Builder().index("foo").id("1").build();
GetResponse<JsonData> response = elasticsearchClient.get(getRequest, JsonData.class);
assertThat(response.found()).isTrue();
assertThat(response.source()).isNotNull();
assertThat(response.source().toJson()).isEqualTo(JsonData.fromJson(jsonObject).toJson());
@@ -87,7 +77,7 @@ public class ElasticsearchSinkTests {
void elasticSearchSinkWithIndexNameFromHeader() {
this.contextRunner
.withPropertyValues("spring.cloud.function.definition=elasticsearchConsumer", "elasticsearch.consumer.id=1",
"spring.elasticsearch.rest.uris=http://" + elasticsearch.getHttpHostAddress())
"spring.elasticsearch.uris=http://" + elasticsearch.getHttpHostAddress())
.run(context -> {
final InputDestination inputDestination = context.getBean(InputDestination.class);
@@ -106,19 +96,7 @@ public class ElasticsearchSinkTests {
}
@SpringBootApplication
@Import(ElasticsearchConsumerConfiguration.class)
static class ElasticsearchSinkTestApplication {
}
@Configuration(proxyBeanMethods = false)
static class Config extends ElasticsearchConfiguration {
@NonNull
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder()
.connectedTo(elasticsearch.getHttpHostAddress())
.build();
}
}
}

View File

@@ -22,7 +22,6 @@
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -23,19 +23,16 @@
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${spring-cloud-starters.version}</version>
<scope>test</scope>
</dependency>
<dependency>

View File

@@ -1,121 +0,0 @@
/*
* Copyright 2023-2023 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 org.springframework.cloud.stream.app.source.debezium.integration;
import java.time.Duration;
import java.util.List;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.stream.binder.test.OutputDestination;
import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.messaging.Message;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Christian Tzolov
*/
@Tag("integration")
@Testcontainers
public class DebeziumSupplierAvroFormatTest {
// E.g. docker run -it --rm --name apicurio -p 8080:8080 apicurio/apicurio-registry-mem:2.4.1.Final
@Container
static GenericContainer<?> apicurio = new GenericContainer<>("apicurio/apicurio-registry-mem:2.4.1.Final")
.withExposedPorts(8080)
.withStartupTimeout(Duration.ofSeconds(120))
.withStartupAttempts(3);
@Container
static GenericContainer<?> debeziumMySQL = new GenericContainer<>(DebeziumTestUtils.DEBEZIUM_EXAMPLE_MYSQL_IMAGE)
.withEnv("MYSQL_ROOT_PASSWORD", "debezium")
.withEnv("MYSQL_USER", "mysqluser")
.withEnv("MYSQL_PASSWORD", "mysqlpw")
.withExposedPorts(3306)
.withStartupTimeout(Duration.ofSeconds(120))
.withStartupAttempts(3);
private final SpringApplicationBuilder applicationBuilder = new SpringApplicationBuilder(
TestChannelBinderConfiguration.getCompleteConfiguration(TestDebeziumSourceApplication.class))
.web(WebApplicationType.NONE)
.properties(
"spring.cloud.function.definition=debeziumSupplier",
"debezium.payloadFormat=AVRO",
"debezium.properties.key.converter=io.apicurio.registry.utils.converter.AvroConverter",
"debezium.properties.key.converter.apicurio.registry.auto-register=true",
"debezium.properties.key.converter.apicurio.registry.find-latest=true",
"debezium.properties.value.converter=io.apicurio.registry.utils.converter.AvroConverter",
"debezium.properties.value.converter.apicurio.registry.auto-register=true",
"debezium.properties.value.converter.apicurio.registry.find-latest=true",
"debezium.properties.schema.name.adjustment.mode=avro",
"debezium.properties.schema.history.internal=io.debezium.relational.history.MemorySchemaHistory",
"debezium.properties.offset.storage=org.apache.kafka.connect.storage.MemoryOffsetBackingStore",
"debezium.properties.topic.prefix=my-topic",
"debezium.properties.name=my-connector",
"debezium.properties.database.server.id=85744",
"debezium.properties.connector.class=io.debezium.connector.mysql.MySqlConnector",
"debezium.properties.database.user=debezium",
"debezium.properties.database.password=dbz",
"debezium.properties.database.hostname=localhost",
// JdbcTemplate configuration
String.format("app.datasource.url=jdbc:mysql://localhost:%d/%s?enabledTLSProtocols=TLSv1.2",
debeziumMySQL.getMappedPort(3306), DebeziumTestUtils.DATABASE_NAME),
"app.datasource.username=root",
"app.datasource.password=debezium",
"app.datasource.driver-class-name=com.mysql.cj.jdbc.Driver",
"app.datasource.type=com.zaxxer.hikari.HikariDataSource");
@Test
public void mysqlWithAvroContentFormat() {
String MYSQL_MAPPED_PORT = String.valueOf(debeziumMySQL.getMappedPort(3306));
String APICURIO_URL = "http://localhost:" + String.valueOf(apicurio.getMappedPort(8080)) + "/apis/registry/v2";
try (ConfigurableApplicationContext context = applicationBuilder.run(
"--debezium.properties.key.converter.apicurio.registry.url=" + APICURIO_URL,
"--debezium.properties.value.converter.apicurio.registry.url=" + APICURIO_URL,
"--debezium.properties.database.port=" + MYSQL_MAPPED_PORT)) {
OutputDestination outputDestination = context.getBean(OutputDestination.class);
// Using local region here
List<Message<?>> messages = DebeziumTestUtils.receiveAll(outputDestination);
assertThat(messages).isNotNull();
// Message size should correspond to the number of insert statements in the sample inventor DB
// configured by:
// https://github.com/debezium/container-images/blob/main/examples/mysql/2.1/inventory.sql
assertThat(messages).hasSizeGreaterThanOrEqualTo(52);
// assertThat(messages).map(message ->
// message.getHeaders().get("contentType")).isEqualTo("application/avro"); // TEST utils bug.
}
}
}

View File

@@ -22,7 +22,6 @@
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -18,6 +18,7 @@ package org.springframework.cloud.stream.app.source.websocket;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.function.Supplier;
import org.junit.jupiter.api.Test;
@@ -37,7 +38,6 @@ import org.springframework.http.HttpHeaders;
import org.springframework.integration.websocket.ClientWebSocketContainer;
import org.springframework.messaging.Message;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.util.Base64Utils;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
@@ -73,7 +73,7 @@ public class WebsocketSourceTests {
this.properties.getPath());
HttpHeaders httpHeaders = new HttpHeaders();
String token = Base64Utils.encodeToString(
String token = Base64.getEncoder().encodeToString(
(this.securityProperties.getUser().getName() + ":" + this.securityProperties.getUser().getPassword())
.getBytes(StandardCharsets.UTF_8));
httpHeaders.set(HttpHeaders.AUTHORIZATION, "Basic " + token);

View File

@@ -17,7 +17,7 @@
<properties>
<stream-apps-core.version>6.0.0-SNAPSHOT</stream-apps-core.version>
<java-functions.version>5.0.1</java-functions.version>
<java-functions.version>5.1.0-SNAPSHOT</java-functions.version>
<prometheus-rsocket.version>1.5.3</prometheus-rsocket.version>
<spring-cloud-dataflow-apps-generator-plugin.version>1.1.0-SNAPSHOT</spring-cloud-dataflow-apps-generator-plugin.version>
<spring-cloud-dataflow-apps-docs-plugin.version>1.1.0-SNAPSHOT</spring-cloud-dataflow-apps-docs-plugin.version>
@@ -42,38 +42,12 @@
<version>${java-functions.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-dependencies</artifactId>
<version>${spring-cloud-function.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-dependencies</artifactId>
<version>${spring-cloud-stream-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-netty</artifactId>
<version>${mockserver.version}</version>
</dependency>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.9.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-bom</artifactId>
<version>${testcontainers.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
@@ -169,17 +143,6 @@
</metadata>
<maven>
<dependencyManagement>
<!-- Temporarily override SC-Fn dependency by giving it the highest precedence since 2020.0.5 release of spring-cloud will not take place until December -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-dependencies</artifactId>
<version>${spring-cloud-function.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-dependencies</artifactId>
<version>${spring-cloud-stream-dependencies.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>

View File

@@ -101,7 +101,6 @@
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>localstack</artifactId>
<version>${testcontainers.version}</version>
</dependency>
</dependencies>

View File

@@ -35,26 +35,26 @@
<nohttp-checkstyle.version>0.0.11</nohttp-checkstyle.version>
<disable.nohttp.checks>true</disable.nohttp.checks>
<spring-javaformat-checkstyle.version>0.0.43</spring-javaformat-checkstyle.version>
<spring-boot.version>3.3.6</spring-boot.version>
<spring.version>6.1.15</spring.version>
<spring-cloud.version>2023.0.4</spring-cloud.version>
<spring-cloud-starters.version>4.1.5</spring-cloud-starters.version>
<spring-cloud-function.version>4.1.4</spring-cloud-function.version>
<spring-cloud-stream-dependencies.version>4.1.4</spring-cloud-stream-dependencies.version>
<testcontainers.version>1.19.8</testcontainers.version>
<spring-boot.version>3.4.2-SNAPSHOT</spring-boot.version>
<spring-cloud.version>2024.0.1-SNAPSHOT</spring-cloud.version>
<!-- =================================================================== -->
<!-- Required only for release train docs generation in -->
<!-- /stream-applications-release-train/stream-applications-docs/pom.xml -->
<spring.version>6.2.1</spring.version>
<spring-cloud-stream-dependencies.version>4.2.1-SNAPSHOT</spring-cloud-stream-dependencies.version>
<!-- =================================================================== -->
<mockserver.version>5.15.0</mockserver.version>
<groovy.version>4.0.24</groovy.version>
<apache-ivy.version>2.5.2</apache-ivy.version>
<jakarta-jms.version>3.1.0</jakarta-jms.version>
<curator.version>5.5.0</curator.version>
<mavenThreads>1</mavenThreads>
<commons-compress.version>1.26.2</commons-compress.version>
<commons-lang3.version>3.17.0</commons-lang3.version>
<!--suppress UnresolvedMavenProperty -->
<buildName>${env.BUILD_NAME}</buildName>
<!--suppress UnresolvedMavenProperty -->
<buildNumber>${env.BUILD_NUMBER}</buildNumber>
</properties>
<okhttp3.version>4.12.0</okhttp3.version>
<!--suppress UnresolvedMavenProperty -->
<buildName>${env.BUILD_NAME}</buildName>
<!--suppress UnresolvedMavenProperty -->
<buildNumber>${env.BUILD_NUMBER}</buildNumber>
</properties>
<url>https://spring.io/projects/spring-cloud-stream-applications</url>
<developers>
@@ -82,12 +82,6 @@
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
@@ -102,37 +96,18 @@
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-dependencies</artifactId>
<version>${spring-cloud-function.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-bom</artifactId>
<version>${testcontainers.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-bom</artifactId>
<version>${groovy.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>jakarta.jms</groupId>
<artifactId>jakarta.jms-api</artifactId>
<version>${jakarta-jms.version}</version>
</dependency>
<dependency>
<groupId>org.apache.ivy</groupId>
<artifactId>ivy</artifactId>
<version>${apache-ivy.version}</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp-bom</artifactId>
<version>${okhttp3.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>