serializerProvider) {
DaprClientBuilder builder = createDaprClientBuilder();
+
+ DaprObjectSerializer serializer = serializerProvider.getIfAvailable();
+ if (serializer != null) {
+ builder.withObjectSerializer(serializer);
+ builder.withStateSerializer(serializer);
+ }
+
String httpEndpoint = daprConnectionDetails.getHttpEndpoint();
if (httpEndpoint != null) {
diff --git a/dapr-spring/dapr-spring-boot-4-autoconfigure/src/main/java/io/dapr/spring/boot4/autoconfigure/client/DaprJackson3SB4AutoConfiguration.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprJackson3AutoConfiguration.java
similarity index 87%
rename from dapr-spring/dapr-spring-boot-4-autoconfigure/src/main/java/io/dapr/spring/boot4/autoconfigure/client/DaprJackson3SB4AutoConfiguration.java
rename to dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprJackson3AutoConfiguration.java
index 471a676f94..03ee450aa2 100644
--- a/dapr-spring/dapr-spring-boot-4-autoconfigure/src/main/java/io/dapr/spring/boot4/autoconfigure/client/DaprJackson3SB4AutoConfiguration.java
+++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/DaprJackson3AutoConfiguration.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.spring.boot4.autoconfigure.client;
+package io.dapr.spring.boot.autoconfigure.client;
import io.dapr.serializer.DaprObjectSerializer;
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -26,11 +26,11 @@
*
* Activates only when Jackson 3 is on the classpath and no other {@link DaprObjectSerializer}
* bean has been defined. Runs after {@link JacksonAutoConfiguration} (which creates the
- * {@link JsonMapper} bean) and before {@link DaprClientSB4AutoConfiguration} (which consumes it).
+ * {@link JsonMapper} bean) and before {@link DaprClientAutoConfiguration} (which consumes it).
*/
-@AutoConfiguration(after = JacksonAutoConfiguration.class, before = DaprClientSB4AutoConfiguration.class)
+@AutoConfiguration(after = JacksonAutoConfiguration.class, before = DaprClientAutoConfiguration.class)
@ConditionalOnClass(JsonMapper.class)
-public class DaprJackson3SB4AutoConfiguration {
+public class DaprJackson3AutoConfiguration {
@Bean
@ConditionalOnMissingBean(DaprObjectSerializer.class)
diff --git a/dapr-spring/dapr-spring-boot-4-autoconfigure/src/main/java/io/dapr/spring/boot4/autoconfigure/client/Jackson3ObjectSerializer.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/Jackson3ObjectSerializer.java
similarity index 98%
rename from dapr-spring/dapr-spring-boot-4-autoconfigure/src/main/java/io/dapr/spring/boot4/autoconfigure/client/Jackson3ObjectSerializer.java
rename to dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/Jackson3ObjectSerializer.java
index a2707b2751..dd4206631e 100644
--- a/dapr-spring/dapr-spring-boot-4-autoconfigure/src/main/java/io/dapr/spring/boot4/autoconfigure/client/Jackson3ObjectSerializer.java
+++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/java/io/dapr/spring/boot/autoconfigure/client/Jackson3ObjectSerializer.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.spring.boot4.autoconfigure.client;
+package io.dapr.spring.boot.autoconfigure.client;
import io.dapr.serializer.DaprObjectSerializer;
import io.dapr.utils.TypeRef;
diff --git a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index b583e70bfb..cb5f990d18 100644
--- a/dapr-spring/dapr-spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +1,2 @@
+io.dapr.spring.boot.autoconfigure.client.DaprJackson3AutoConfiguration
io.dapr.spring.boot.autoconfigure.client.DaprClientAutoConfiguration
diff --git a/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientAutoConfigurationTest.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientAutoConfigurationTest.java
index c73c4b102f..4eae48bf30 100644
--- a/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientAutoConfigurationTest.java
+++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientAutoConfigurationTest.java
@@ -15,14 +15,16 @@
import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
-import io.dapr.spring.boot.properties.client.DaprConnectionDetails;
import io.dapr.config.Properties;
+import io.dapr.serializer.DaprObjectSerializer;
+import io.dapr.spring.boot.properties.client.DaprConnectionDetails;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -47,6 +49,9 @@ class DaprClientAutoConfigurationTest {
private DaprClientAutoConfiguration configuration;
+ @Mock
+ private ObjectProvider serializerProvider;
+
@Test
void daprClientBuilder() {
contextRunner.run(context -> assertThat(context).hasSingleBean(DaprClientBuilder.class));
@@ -69,7 +74,7 @@ void shouldOverrideHttpEndpointIfExists() {
when(connectionDetails.getHttpEndpoint()).thenReturn(httpEndpoint);
- configuration.daprClientBuilder(connectionDetails);
+ configuration.daprClientBuilder(connectionDetails, serializerProvider);
verify(builder).withPropertyOverride(Properties.HTTP_ENDPOINT, httpEndpoint);
}
@@ -81,7 +86,7 @@ void shouldOverrideGrpcEndpointIfExists() {
when(connectionDetails.getGrpcEndpoint()).thenReturn(grpcEndpoint);
- configuration.daprClientBuilder(connectionDetails);
+ configuration.daprClientBuilder(connectionDetails, serializerProvider);
verify(builder).withPropertyOverride(Properties.GRPC_ENDPOINT, grpcEndpoint);
}
@@ -93,7 +98,7 @@ void shouldOverrideHttpPortIfExists() {
when(connectionDetails.getHttpPort()).thenReturn(httpPort);
- configuration.daprClientBuilder(connectionDetails);
+ configuration.daprClientBuilder(connectionDetails, serializerProvider);
verify(builder).withPropertyOverride(Properties.HTTP_PORT, String.valueOf(httpPort));
}
@@ -105,7 +110,7 @@ void shouldOverrideGrpcPortIfExists() {
when(connectionDetails.getGrpcPort()).thenReturn(grpcPort);
- configuration.daprClientBuilder(connectionDetails);
+ configuration.daprClientBuilder(connectionDetails, serializerProvider);
verify(builder).withPropertyOverride(Properties.GRPC_PORT, String.valueOf(grpcPort));
}
@@ -117,7 +122,7 @@ void shouldOverrideApiTokenIfExists() {
when(connectionDetails.getApiToken()).thenReturn(apiToken);
- configuration.daprClientBuilder(connectionDetails);
+ configuration.daprClientBuilder(connectionDetails, serializerProvider);
verify(builder).withPropertyOverride(Properties.API_TOKEN, apiToken);
}
diff --git a/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientObservationAutoConfigurationTest.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientObservationAutoConfigurationTest.java
deleted file mode 100644
index 5141af8021..0000000000
--- a/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprClientObservationAutoConfigurationTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.spring.boot.autoconfigure.client;
-
-import io.dapr.client.DaprClient;
-import io.dapr.client.DaprClientBuilder;
-import io.dapr.spring.observation.client.ObservationDaprClient;
-import io.dapr.spring.observation.client.ObservationDaprWorkflowClient;
-import io.dapr.workflows.client.DaprWorkflowClient;
-import io.micrometer.observation.ObservationRegistry;
-import io.micrometer.observation.tck.TestObservationRegistry;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.autoconfigure.AutoConfigurations;
-import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-/**
- * Integration tests for the observation wiring in {@link DaprClientAutoConfiguration}.
- *
- * Verifies two key requirements:
- *
- * - When a non-noop {@link ObservationRegistry} is present, both {@code DaprClient} and
- * {@code DaprWorkflowClient} beans are wrapped with observation decorators.
- * - Consumers inject the beans by their base types ({@code DaprClient},
- * {@code DaprWorkflowClient}) — no code changes needed.
- *
- */
-class DaprClientObservationAutoConfigurationTest {
-
- private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(DaprClientAutoConfiguration.class));
-
- // -------------------------------------------------------------------------
- // Without ObservationRegistry — plain beans
- // -------------------------------------------------------------------------
-
- @Test
- @DisplayName("DaprClient is a plain client when no ObservationRegistry is present")
- void daprClientIsPlainWhenNoRegistry() {
- contextRunner
- .withBean(DaprClientBuilder.class, () -> mockBuilderReturningMockClient())
- .run(context -> {
- assertThat(context).hasSingleBean(DaprClient.class);
- assertThat(context.getBean(DaprClient.class))
- .isNotInstanceOf(ObservationDaprClient.class);
- });
- }
-
- // -------------------------------------------------------------------------
- // With ObservationRegistry — wrapped beans
- // -------------------------------------------------------------------------
-
- @Test
- @DisplayName("DaprClient is ObservationDaprClient when a non-noop ObservationRegistry is present")
- void daprClientIsObservationWrappedWhenRegistryPresent() {
- contextRunner
- .withBean(DaprClientBuilder.class, () -> mockBuilderReturningMockClient())
- .withBean(ObservationRegistry.class, TestObservationRegistry::create)
- .run(context -> {
- assertThat(context).hasSingleBean(DaprClient.class);
- assertThat(context.getBean(DaprClient.class))
- .isInstanceOf(ObservationDaprClient.class);
- });
- }
-
- @Test
- @DisplayName("DaprWorkflowClient is ObservationDaprWorkflowClient when a non-noop registry is present")
- void daprWorkflowClientIsObservationWrappedWhenRegistryPresent() {
- contextRunner
- .withBean(DaprClientBuilder.class, () -> mockBuilderReturningMockClient())
- .withBean(ObservationRegistry.class, TestObservationRegistry::create)
- .run(context -> {
- assertThat(context).hasSingleBean(DaprWorkflowClient.class);
- assertThat(context.getBean(DaprWorkflowClient.class))
- .isInstanceOf(ObservationDaprWorkflowClient.class);
- });
- }
-
- // -------------------------------------------------------------------------
- // Transparency — beans remain injectable by base type
- // -------------------------------------------------------------------------
-
- @Test
- @DisplayName("Consumers can inject DaprClient by its base type regardless of wrapping")
- void daprClientInjectableByBaseType() {
- contextRunner
- .withBean(DaprClientBuilder.class, () -> mockBuilderReturningMockClient())
- .withBean(ObservationRegistry.class, TestObservationRegistry::create)
- .run(context -> {
- // Injecting as DaprClient works — no ClassCastException, no code changes needed
- DaprClient client = context.getBean(DaprClient.class);
- assertThat(client).isNotNull();
- assertThat(client).isInstanceOf(DaprClient.class);
- });
- }
-
- @Test
- @DisplayName("Consumers can inject DaprWorkflowClient by its base type regardless of wrapping")
- void daprWorkflowClientInjectableByBaseType() {
- contextRunner
- .withBean(DaprClientBuilder.class, () -> mockBuilderReturningMockClient())
- .withBean(ObservationRegistry.class, TestObservationRegistry::create)
- .run(context -> {
- // Injecting as DaprWorkflowClient works — ObservationDaprWorkflowClient IS-A DaprWorkflowClient
- DaprWorkflowClient workflowClient = context.getBean(DaprWorkflowClient.class);
- assertThat(workflowClient).isNotNull();
- assertThat(workflowClient).isInstanceOf(DaprWorkflowClient.class);
- });
- }
-
- @Test
- @DisplayName("Noop ObservationRegistry results in plain (unwrapped) DaprClient")
- void noopRegistryResultsInPlainClient() {
- contextRunner
- .withBean(DaprClientBuilder.class, () -> mockBuilderReturningMockClient())
- .withBean(ObservationRegistry.class, ObservationRegistry::create) // NOOP registry
- .run(context -> {
- assertThat(context).hasSingleBean(DaprClient.class);
- assertThat(context.getBean(DaprClient.class))
- .isNotInstanceOf(ObservationDaprClient.class);
- });
- }
-
- @Test
- @DisplayName("User-provided DaprClient bean is not replaced by autoconfiguration")
- void userProvidedDaprClientIsNotReplaced() {
- DaprClient userClient = mock(DaprClient.class);
- contextRunner
- .withBean(ObservationRegistry.class, TestObservationRegistry::create)
- .withBean(DaprClient.class, () -> userClient)
- .run(context -> {
- assertThat(context).hasSingleBean(DaprClient.class);
- assertThat(context.getBean(DaprClient.class)).isSameAs(userClient);
- });
- }
-
- // -------------------------------------------------------------------------
- // Helpers
- // -------------------------------------------------------------------------
-
- private static DaprClientBuilder mockBuilderReturningMockClient() {
- DaprClientBuilder builder = mock(DaprClientBuilder.class);
- when(builder.build()).thenReturn(mock(DaprClient.class));
- return builder;
- }
-}
diff --git a/dapr-spring/dapr-spring-boot-4-autoconfigure/src/test/java/io/dapr/spring/boot4/autoconfigure/client/DaprJackson3SB4AutoConfigurationTest.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprJackson3AutoConfigurationTest.java
similarity index 95%
rename from dapr-spring/dapr-spring-boot-4-autoconfigure/src/test/java/io/dapr/spring/boot4/autoconfigure/client/DaprJackson3SB4AutoConfigurationTest.java
rename to dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprJackson3AutoConfigurationTest.java
index 808a257766..6a56ddf826 100644
--- a/dapr-spring/dapr-spring-boot-4-autoconfigure/src/test/java/io/dapr/spring/boot4/autoconfigure/client/DaprJackson3SB4AutoConfigurationTest.java
+++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/DaprJackson3AutoConfigurationTest.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.spring.boot4.autoconfigure.client;
+package io.dapr.spring.boot.autoconfigure.client;
import io.dapr.serializer.DaprObjectSerializer;
import org.junit.jupiter.api.DisplayName;
@@ -25,12 +25,12 @@
import static org.assertj.core.api.Assertions.assertThat;
-class DaprJackson3SB4AutoConfigurationTest {
+class DaprJackson3AutoConfigurationTest {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(
JacksonAutoConfiguration.class,
- DaprJackson3SB4AutoConfiguration.class));
+ DaprJackson3AutoConfiguration.class));
@Test
@DisplayName("Should create DaprObjectSerializer bean when Jackson 3 is on classpath")
diff --git a/dapr-spring/dapr-spring-boot-4-autoconfigure/src/test/java/io/dapr/spring/boot4/autoconfigure/client/Jackson3ObjectSerializerTest.java b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/Jackson3ObjectSerializerTest.java
similarity index 99%
rename from dapr-spring/dapr-spring-boot-4-autoconfigure/src/test/java/io/dapr/spring/boot4/autoconfigure/client/Jackson3ObjectSerializerTest.java
rename to dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/Jackson3ObjectSerializerTest.java
index 2ac4bc8ea3..0f7f4f6845 100644
--- a/dapr-spring/dapr-spring-boot-4-autoconfigure/src/test/java/io/dapr/spring/boot4/autoconfigure/client/Jackson3ObjectSerializerTest.java
+++ b/dapr-spring/dapr-spring-boot-autoconfigure/src/test/java/io/dapr/spring/boot/autoconfigure/client/Jackson3ObjectSerializerTest.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.spring.boot4.autoconfigure.client;
+package io.dapr.spring.boot.autoconfigure.client;
import io.dapr.utils.TypeRef;
import org.junit.jupiter.api.BeforeEach;
diff --git a/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-4-starter-test/pom.xml b/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-4-starter-test/pom.xml
deleted file mode 100644
index cebdcd35fa..0000000000
--- a/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-4-starter-test/pom.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
- 4.0.0
-
-
- io.dapr.spring
- dapr-spring-parent
- 1.19.0-SNAPSHOT
- ../../pom.xml
-
-
- dapr-spring-boot-4-starter-test
- dapr-spring-boot-4-starter-test
- Dapr Spring Boot Starter 4.x Tests (with Testcontainers Support)
- jar
-
-
- 4.0.5
-
- 6.0.2
-
-
-
-
- org.springframework.boot
- spring-boot-dependencies
- ${springboot4.version}
- pom
- import
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-test
-
-
- io.dapr.spring
- dapr-spring-boot-tests
-
-
- io.dapr
- testcontainers-dapr
-
-
- org.springframework.boot
- spring-boot-testcontainers
-
-
- org.testcontainers
- testcontainers-junit-jupiter
- true
-
-
-
-
-
- org.sonatype.plugins
- nexus-staging-maven-plugin
-
-
-
-
diff --git a/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-4-starter/pom.xml b/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-4-starter/pom.xml
deleted file mode 100644
index 0d9522adc3..0000000000
--- a/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-4-starter/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
- 4.0.0
-
-
- io.dapr.spring
- dapr-spring-parent
- 1.19.0-SNAPSHOT
- ../../pom.xml
-
-
- dapr-spring-boot-4-starter
- dapr-spring-boot-4-starter
- Dapr Spring Boot 4.x Starter
- jar
-
-
- 4.0.5
-
- 6.0.2
-
-
-
-
-
- org.springframework.boot
- spring-boot-dependencies
- ${springboot4.version}
- pom
- import
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter
-
-
- io.dapr
- dapr-sdk-springboot
-
-
- io.dapr.spring
- dapr-spring-boot-properties
-
-
- io.dapr.spring
- dapr-spring-boot-4-autoconfigure
-
-
- io.dapr.spring
- dapr-spring-6-data
-
-
- io.dapr.spring
- dapr-spring-messaging
-
-
- io.dapr.spring
- dapr-spring-workflows
-
-
-
-
-
-
- org.sonatype.plugins
- nexus-staging-maven-plugin
-
-
-
-
diff --git a/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter-test/pom.xml b/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter-test/pom.xml
index f71959657e..0fe42338e5 100644
--- a/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter-test/pom.xml
+++ b/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter-test/pom.xml
@@ -4,10 +4,10 @@
4.0.0
- io.dapr.spring
- dapr-spring-parent
- 1.19.0-SNAPSHOT
- ../../pom.xml
+ io.dapr.spring
+ dapr-spring-parent
+ 1.19.0-SNAPSHOT
+ ../../pom.xml
dapr-spring-boot-starter-test
@@ -15,6 +15,22 @@
Dapr Spring Boot Starter Tests (with Testcontainers Support)
jar
+
+ 4.0.5
+
+ 6.0.2
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${springboot4.version}
+ pom
+ import
+
+
+
org.springframework.boot
diff --git a/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter/pom.xml b/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter/pom.xml
index d8997b1aa4..850d09c0c7 100644
--- a/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter/pom.xml
+++ b/dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter/pom.xml
@@ -15,6 +15,24 @@
Dapr Spring Boot Starter
jar
+
+ 4.0.5
+
+ 6.0.2
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${springboot4.version}
+ pom
+ import
+
+
+
+
org.springframework.boot
@@ -24,6 +42,10 @@
io.dapr
dapr-sdk-springboot
+
+ io.dapr.spring
+ dapr-spring-boot-properties
+
io.dapr.spring
dapr-spring-boot-autoconfigure
diff --git a/dapr-spring/dapr-spring-data/pom.xml b/dapr-spring/dapr-spring-data/pom.xml
index e700e6c436..6873db6267 100644
--- a/dapr-spring/dapr-spring-data/pom.xml
+++ b/dapr-spring/dapr-spring-data/pom.xml
@@ -1,7 +1,7 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
@@ -16,6 +16,24 @@
Dapr Spring Data
jar
+
+ 4.0.5
+
+ 6.0.2
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${springboot4.version}
+ pom
+ import
+
+
+
+
org.springframework.data
@@ -39,4 +57,5 @@
-
+
+
\ No newline at end of file
diff --git a/dapr-spring/dapr-spring-data/src/main/java/io/dapr/spring/data/AbstractDaprKeyValueAdapter.java b/dapr-spring/dapr-spring-data/src/main/java/io/dapr/spring/data/AbstractDaprKeyValueAdapter.java
index 82b59dbd6a..07acf85a3c 100644
--- a/dapr-spring/dapr-spring-data/src/main/java/io/dapr/spring/data/AbstractDaprKeyValueAdapter.java
+++ b/dapr-spring/dapr-spring-data/src/main/java/io/dapr/spring/data/AbstractDaprKeyValueAdapter.java
@@ -23,7 +23,6 @@
import org.springframework.util.Assert;
import reactor.core.publisher.Mono;
-import java.util.Collections;
import java.util.Map;
public abstract class AbstractDaprKeyValueAdapter implements KeyValueAdapter {
@@ -124,7 +123,7 @@ public T delete(Object id, String keyspace, Class type) {
}
@Override
- public Iterable> getAllOf(String keyspace) {
+ public Iterable
-
- io.dapr.spring
- dapr-spring-6-data
- ${project.version}
-
io.dapr.spring
dapr-spring-messaging
@@ -67,11 +58,6 @@
dapr-spring-boot-autoconfigure
${project.version}
-
- io.dapr.spring
- dapr-spring-boot-4-autoconfigure
- ${project.version}
-
io.dapr.spring
dapr-spring-boot-properties
diff --git a/examples/src/main/java/io/dapr/examples/OpenTelemetryConfig.java b/examples/src/main/java/io/dapr/examples/OpenTelemetryConfig.java
index a9cd028b3f..558e34d2fe 100644
--- a/examples/src/main/java/io/dapr/examples/OpenTelemetryConfig.java
+++ b/examples/src/main/java/io/dapr/examples/OpenTelemetryConfig.java
@@ -28,8 +28,6 @@
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -39,7 +37,7 @@
import java.util.Map;
@Configuration
-@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
+@EnableAutoConfiguration
public class OpenTelemetryConfig {
private static final int ZIPKIN_PORT = 9411;
diff --git a/examples/src/main/java/io/dapr/examples/tracing/README.md b/examples/src/main/java/io/dapr/examples/tracing/README.md
index 4f7945ec5b..b778f2dec4 100644
--- a/examples/src/main/java/io/dapr/examples/tracing/README.md
+++ b/examples/src/main/java/io/dapr/examples/tracing/README.md
@@ -200,7 +200,7 @@ Then, `getReactorContext()` method is used to convert the OpenTelemetry's contex
```java
@Configuration
-@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
+@EnableAutoConfiguration
public class OpenTelemetryConfig {
// ...
public static reactor.util.context.Context getReactorContext(Context context) {
diff --git a/pom.xml b/pom.xml
index f039e6254c..8dec3600dd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,7 +52,7 @@
5.11.4
2.0
2.0.5
- 3.5.12
+ 4.0.5
1.7.0
3.27.7
1.41.0
@@ -126,13 +126,10 @@
pom
import
-
- org.springframework.boot
- spring-boot-dependencies
- ${springboot.version}
- pom
- import
-
+
org.junit
junit-bom
@@ -140,6 +137,13 @@
import
pom
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${springboot.version}
+ pom
+ import
+
org.testcontainers
testcontainers-bom
@@ -258,21 +262,11 @@
dapr-spring-boot-starter
${dapr.sdk.version}
-
- io.dapr.spring
- dapr-spring-boot-4-starter
- ${dapr.sdk.version}
-
io.dapr.spring
dapr-spring-boot-starter-test
${dapr.sdk.version}
-
- io.dapr.spring
- dapr-spring-boot-4-starter-test
- ${dapr.sdk.version}
-
io.dapr
testcontainers-dapr
@@ -532,7 +526,6 @@
io/dapr/durabletask/**/*
io/dapr/springboot/examples/**/*
- io/dapr/springboot4/examples/**/*
@@ -757,26 +750,8 @@
sdk-tests
spring-boot-examples
+ spring-boot-sdk-tests
durabletask-client
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
- true
-
-
-
-
-
-
-
- integration-sb4-tests
-
- spring-boot-4-examples
- spring-boot-4-sdk-tests
diff --git a/sdk-tests/pom.xml b/sdk-tests/pom.xml
index 47f4be822a..21ce6c7cae 100644
--- a/sdk-tests/pom.xml
+++ b/sdk-tests/pom.xml
@@ -26,20 +26,21 @@
0%
- 1.11.4
+ 4.0.5
+
+ 6.0.2
+
- org.junit.platform
- junit-platform-commons
- ${junit-platform.version}
-
-
- org.junit.platform
- junit-platform-engine
- ${junit-platform.version}
+ org.springframework.boot
+ spring-boot-dependencies
+ ${springboot4.version}
+ pom
+ import
diff --git a/spring-boot-4-examples/consumer-app/pom.xml b/spring-boot-4-examples/consumer-app/pom.xml
deleted file mode 100644
index 8767284e3a..0000000000
--- a/spring-boot-4-examples/consumer-app/pom.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
- 4.0.0
-
- io.dapr
- spring-boot-4-examples
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- sb4-consumer-app
- sb4-consumer-app
- Spring Boot 4, Testcontainers and Dapr Integration Examples :: Consumer App
-
-
-
- org.springframework.boot
- spring-boot-starter-webmvc
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter-test
- test
-
-
- org.testcontainers
- testcontainers-junit-jupiter
- test
-
-
- org.testcontainers
- testcontainers-postgresql
- test
-
-
- org.testcontainers
- testcontainers-rabbitmq
- test
-
-
- org.testcontainers
- testcontainers-kafka
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- test
-
-
- org.springframework.boot
- spring-boot-starter-webmvc-test
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
-
-
-
diff --git a/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/ConsumerApplication.java b/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/ConsumerApplication.java
deleted file mode 100644
index 82853b7936..0000000000
--- a/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/ConsumerApplication.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.consumer;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class ConsumerApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(ConsumerApplication.class, args);
- }
-
-}
diff --git a/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/Order.java b/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/Order.java
deleted file mode 100644
index 7bfb5839c9..0000000000
--- a/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/Order.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.consumer;
-
-public class Order {
- private String id;
- private String item;
- private Integer amount;
-
- public Order() {
- }
-
- /**
- * Creates a new Order.
- *
- * @param id order id
- * @param item item reference
- * @param amount of items in the order
- */
- public Order(String id, String item, Integer amount) {
- this.id = id;
- this.item = item;
- this.amount = amount;
- }
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getItem() {
- return item;
- }
-
- public void setItem(String item) {
- this.item = item;
- }
-
- public Integer getAmount() {
- return amount;
- }
-
- public void setAmount(Integer amount) {
- this.amount = amount;
- }
-
- @Override
- public String toString() {
- return "Order{" + "id='" + id + '\'' + ", item='" + item + '\'' + ", amount=" + amount + '}';
- }
-}
diff --git a/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/SubscriberRestController.java b/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/SubscriberRestController.java
deleted file mode 100644
index f57e70194e..0000000000
--- a/spring-boot-4-examples/consumer-app/src/main/java/io/dapr/springboot4/examples/consumer/SubscriberRestController.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.consumer;
-
-import io.dapr.Topic;
-import io.dapr.client.domain.CloudEvent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RestController
-public class SubscriberRestController {
-
- private final Logger logger = LoggerFactory.getLogger(SubscriberRestController.class);
-
- private List events = new ArrayList<>();
-
- /**
- * Subscribe to cloud events.
- * @param cloudEvent payload
- */
- @PostMapping("subscribe")
- @Topic(pubsubName = "pubsub", name = "topic")
- public void subscribe(@RequestBody CloudEvent cloudEvent) {
- logger.info("Order Event Received: " + cloudEvent.getData());
- events.add(cloudEvent);
- }
-
- @GetMapping("events")
- public List getAllEvents() {
- return events;
- }
-
-}
-
diff --git a/spring-boot-4-examples/consumer-app/src/main/resources/application.properties b/spring-boot-4-examples/consumer-app/src/main/resources/application.properties
deleted file mode 100644
index b01c2106d8..0000000000
--- a/spring-boot-4-examples/consumer-app/src/main/resources/application.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-dapr.pubsub.name=pubsub
-spring.application.name=consumer-app
-server.port=8081
-
diff --git a/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/ConsumerAppIT.java b/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/ConsumerAppIT.java
deleted file mode 100644
index 1d7f4871fb..0000000000
--- a/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/ConsumerAppIT.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.consumer;
-
-import io.dapr.client.DaprClient;
-import io.dapr.spring.messaging.DaprMessagingTemplate;
-import io.dapr.springboot.DaprAutoConfiguration;
-import io.dapr.testcontainers.DaprContainer;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.web.server.LocalServerPort;
-import org.springframework.test.web.servlet.client.RestTestClient;
-import org.testcontainers.containers.wait.strategy.Wait;
-
-import java.time.Duration;
-
-import static org.awaitility.Awaitility.await;
-import static org.hamcrest.CoreMatchers.equalTo;
-
-
-@SpringBootTest(classes = {TestConsumerApplication.class, DaprTestContainersConfig.class,
- ConsumerAppTestConfiguration.class, DaprAutoConfiguration.class},
- webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
-class ConsumerAppIT {
-
- private static final String SUBSCRIPTION_MESSAGE_PATTERN = ".*app is subscribed to the following topics.*";
-
- @Autowired
- private DaprMessagingTemplate messagingTemplate;
-
- @Autowired
- private SubscriberRestController subscriberRestController;
-
- @Autowired
- private DaprClient daprClient;
-
- @Autowired
- private DaprContainer daprContainer;
-
- @LocalServerPort
- private int port;
-
- private RestTestClient client;
-
- @BeforeAll
- public static void setup() {
- org.testcontainers.Testcontainers.exposeHostPorts(8081);
- }
-
- @BeforeEach
- void setUp() {
- client = RestTestClient.bindToServer()
- .baseUrl("http://localhost:" + port)
- .build();
- Wait.forLogMessage(SUBSCRIPTION_MESSAGE_PATTERN, 1).waitUntilReady(daprContainer);
- }
-
-
- @Test
- void testMessageConsumer() throws InterruptedException {
-
- messagingTemplate.send("topic", new Order("abc-123", "the mars volta LP", 1));
-
- client.get()
- .uri("/events")
- .exchange()
- .expectStatus().isOk();
-
- await().atMost(Duration.ofSeconds(10))
- .until(subscriberRestController.getAllEvents()::size, equalTo(1));
-
- }
-
-}
diff --git a/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/ConsumerAppTestConfiguration.java b/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/ConsumerAppTestConfiguration.java
deleted file mode 100644
index 3384b1f241..0000000000
--- a/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/ConsumerAppTestConfiguration.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.consumer;
-
-import io.dapr.client.DaprClient;
-import io.dapr.spring.boot.properties.pubsub.DaprPubSubProperties;
-import io.dapr.spring.messaging.DaprMessagingTemplate;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@EnableConfigurationProperties({DaprPubSubProperties.class})
-public class ConsumerAppTestConfiguration {
- @Bean
- public DaprMessagingTemplate messagingTemplate(DaprClient daprClient,
- DaprPubSubProperties daprPubSubProperties) {
- return new DaprMessagingTemplate<>(daprClient, daprPubSubProperties.getName(), false);
- }
-}
diff --git a/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/DaprTestContainersConfig.java b/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/DaprTestContainersConfig.java
deleted file mode 100644
index 00ad0600f8..0000000000
--- a/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/DaprTestContainersConfig.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.consumer;
-
-import io.dapr.testcontainers.Component;
-import io.dapr.testcontainers.DaprContainer;
-import io.dapr.testcontainers.DaprLogLevel;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.env.Environment;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.containers.Network;
-import org.testcontainers.rabbitmq.RabbitMQContainer;
-import org.testcontainers.utility.DockerImageName;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static io.dapr.testcontainers.DaprContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
-
-@TestConfiguration(proxyBeanMethods = false)
-public class DaprTestContainersConfig {
-
- @Bean
- public Network getDaprNetwork(Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- if (reuse) {
- Network defaultDaprNetwork = new Network() {
- @Override
- public String getId() {
- return "dapr-network";
- }
-
- @Override
- public void close() {
-
- }
- };
-
- List networks = DockerClientFactory.instance().client().listNetworksCmd()
- .withNameFilter("dapr-network").exec();
- if (networks.isEmpty()) {
- Network.builder().createNetworkCmdModifier(cmd -> cmd.withName("dapr-network")).build().getId();
- return defaultDaprNetwork;
- } else {
- return defaultDaprNetwork;
- }
- } else {
- return Network.newNetwork();
- }
- }
-
- @Bean
- public RabbitMQContainer rabbitMQContainer(Network daprNetwork, Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- return new RabbitMQContainer(DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))
- .withExposedPorts(5672)
- .withNetworkAliases("rabbitmq")
- .withReuse(reuse)
- .withNetwork(daprNetwork);
- }
-
- @Bean
- @ServiceConnection
- public DaprContainer daprContainer(Network daprNetwork, RabbitMQContainer rabbitMQContainer, Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- Map rabbitMqProperties = new HashMap<>();
- rabbitMqProperties.put("connectionString", "amqp://guest:guest@rabbitmq:5672");
- rabbitMqProperties.put("user", "guest");
- rabbitMqProperties.put("password", "guest");
-
- return new DaprContainer(DAPR_RUNTIME_IMAGE_TAG)
- .withAppName("consumer-app")
- .withNetwork(daprNetwork).withComponent(new Component("pubsub",
- "pubsub.rabbitmq", "v1", rabbitMqProperties))
- .withDaprLogLevel(DaprLogLevel.INFO)
- .withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
- .withAppPort(8081).withAppChannelAddress("host.testcontainers.internal")
- .withReusablePlacement(reuse)
- .withReusableScheduler(reuse)
- .withAppHealthCheckPath("/actuator/health")
- .dependsOn(rabbitMQContainer);
- }
-
-}
diff --git a/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/TestConsumerApplication.java b/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/TestConsumerApplication.java
deleted file mode 100644
index 8b954434ee..0000000000
--- a/spring-boot-4-examples/consumer-app/src/test/java/io/dapr/springboot4/examples/consumer/TestConsumerApplication.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.consumer;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class TestConsumerApplication {
-
- public static void main(String[] args) {
- SpringApplication.from(ConsumerApplication::main)
- .with(DaprTestContainersConfig.class)
- .run(args);
- org.testcontainers.Testcontainers.exposeHostPorts(8081);
- }
-
-
-}
diff --git a/spring-boot-4-examples/pom.xml b/spring-boot-4-examples/pom.xml
deleted file mode 100644
index 21b7bf3136..0000000000
--- a/spring-boot-4-examples/pom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
- 4.0.0
-
- io.dapr
- dapr-sdk-parent
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- spring-boot-4-examples
- pom
-
-
- true
- 4.0.5
-
- 6.0.2
-
-
-
- producer-app
- consumer-app
- workflows
-
-
-
-
-
-
- tools.jackson
- jackson-bom
- 3.1.1
- pom
- import
-
-
- org.springframework.boot
- spring-boot-dependencies
- ${springboot4.version}
- pom
- import
-
-
- org.springframework.boot
- spring-boot-starter-webmvc
- ${springboot4.version}
-
-
- org.springframework.boot
- spring-boot-starter-webmvc-test
- ${springboot4.version}
- test
-
-
- org.springframework.boot
- spring-boot-starter-restclient
- ${springboot4.version}
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
- org.apache.maven.plugins
- maven-failsafe-plugin
-
- ${project.build.outputDirectory}
-
-
-
- org.jacoco
- jacoco-maven-plugin
-
-
-
- **/*io/dapr/springboot/examples/**
-
-
-
-
-
-
diff --git a/spring-boot-4-examples/producer-app/pom.xml b/spring-boot-4-examples/producer-app/pom.xml
deleted file mode 100644
index 80a11a01ed..0000000000
--- a/spring-boot-4-examples/producer-app/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
- 4.0.0
-
-
- io.dapr
- spring-boot-4-examples
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- sb4-producer-app
- sb4-producer-app
- Spring Boot 4, Testcontainers and Dapr Integration Examples :: Producer App
-
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
- org.springframework.boot
- spring-boot-starter-webmvc
-
-
- org.springframework.boot
- spring-boot-starter-webmvc-test
- test
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter-test
- test
-
-
- org.testcontainers
- testcontainers-postgresql
- test
-
-
- org.testcontainers
- testcontainers-rabbitmq
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
-
-
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Customer.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Customer.java
deleted file mode 100644
index 9303712686..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Customer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-public class Customer {
- private String customerName;
- private String workflowId;
- private boolean inCustomerDB = false;
- private boolean followUp = false;
-
- public boolean isFollowUp() {
- return followUp;
- }
-
- public void setFollowUp(boolean followUp) {
- this.followUp = followUp;
- }
-
- public boolean isInCustomerDB() {
- return inCustomerDB;
- }
-
- public void setInCustomerDB(boolean inCustomerDB) {
- this.inCustomerDB = inCustomerDB;
- }
-
- public String getWorkflowId() {
- return workflowId;
- }
-
- public void setWorkflowId(String workflowId) {
- this.workflowId = workflowId;
- }
-
- public String getCustomerName() {
- return customerName;
- }
-
- public void setCustomerName(String customerName) {
- this.customerName = customerName;
- }
-
- @Override
- public String toString() {
- return "Customer [customerName=" + customerName + ", workflowId=" + workflowId + ", inCustomerDB="
- + inCustomerDB + ", followUp=" + followUp + "]";
- }
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/CustomerStore.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/CustomerStore.java
deleted file mode 100644
index 22b32401ab..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/CustomerStore.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import org.springframework.stereotype.Component;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-@Component
-public class CustomerStore {
- private Map customers = new HashMap<>();
-
- public void addCustomer(Customer customer) {
- customers.put(customer.getCustomerName(), customer);
- }
-
- public Customer getCustomer(String customerName) {
- return customers.get(customerName);
- }
-
- public Collection getCustomers() {
- return customers.values();
- }
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/CustomersRestController.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/CustomersRestController.java
deleted file mode 100644
index 03ce49e52f..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/CustomersRestController.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import io.dapr.spring.workflows.config.EnableDaprWorkflows;
-import io.dapr.springboot4.examples.producer.workflow.CustomerWorkflow;
-import io.dapr.workflows.client.DaprWorkflowClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-@RestController
-@EnableDaprWorkflows
-public class CustomersRestController {
-
-
- private final Logger logger = LoggerFactory.getLogger(CustomersRestController.class);
-
- @Autowired
- private DaprWorkflowClient daprWorkflowClient;
-
- @Autowired
- private CustomerStore customerStore;
-
- @GetMapping("/")
- public String root() {
- return "OK";
- }
-
- private Map customersWorkflows = new HashMap<>();
-
- /**
- * Track customer endpoint.
- *
- * @param customer provided customer to track
- * @return confirmation that the workflow instance was created for a given customer
- */
- @PostMapping("/customers")
- public String trackCustomer(@RequestBody Customer customer) {
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(CustomerWorkflow.class, customer);
- logger.info("Workflow instance " + instanceId + " started");
- customersWorkflows.put(customer.getCustomerName(), instanceId);
- return "New Workflow Instance created for Customer: " + customer.getCustomerName();
- }
-
- /**
- * Request customer follow-up.
- * @param customer associated with a workflow instance
- * @return confirmation that the follow-up was requested
- */
- @PostMapping("/customers/followup")
- public String customerNotification(@RequestBody Customer customer) {
- logger.info("Customer follow-up requested: " + customer.getCustomerName());
- String workflowIdForCustomer = customersWorkflows.get(customer.getCustomerName());
- if (workflowIdForCustomer == null || workflowIdForCustomer.isEmpty()) {
- return "There is no workflow associated with customer: " + customer.getCustomerName();
- } else {
- daprWorkflowClient.raiseEvent(workflowIdForCustomer, "CustomerReachOut", customer);
- return "Customer Follow-up requested";
- }
- }
-
-
- public Collection getCustomers() {
- return customerStore.getCustomers();
- }
-
-
-}
-
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Order.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Order.java
deleted file mode 100644
index 737bdf8461..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Order.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import org.springframework.data.annotation.Id;
-
-public class Order {
-
- @Id
- private String id;
- private String item;
- private Integer amount;
-
- public Order() {
- }
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getItem() {
- return item;
- }
-
- public void setItem(String item) {
- this.item = item;
- }
-
- public Integer getAmount() {
- return amount;
- }
-
- public void setAmount(Integer amount) {
- this.amount = amount;
- }
-
- @Override
- public String toString() {
- return "Order{" + "id='" + id + '\'' + ", item='" + item + '\'' + ", amount=" + amount + '}';
- }
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrderDTO.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrderDTO.java
deleted file mode 100644
index 5c7cde84d2..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrderDTO.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package io.dapr.springboot4.examples.producer;
-
-public class OrderDTO {
-
- private String id;
- private String item;
- private Integer amount;
-
- public OrderDTO() {
- }
-
- public OrderDTO(String id, String item, Integer amount) {
- this.id = id;
- this.item = item;
- this.amount = amount;
- }
-
- public String getId() {
- return id;
- }
-
-
- public String getItem() {
- return item;
- }
-
- public Integer getAmount() {
- return amount;
- }
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrderRepository.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrderRepository.java
deleted file mode 100644
index 0616fa3b29..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrderRepository.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import org.springframework.data.repository.CrudRepository;
-
-import java.util.List;
-
-public interface OrderRepository extends CrudRepository {
-
- List findByItem(String item);
-
- List findByAmount(Integer amount);
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrdersRestController.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrdersRestController.java
deleted file mode 100644
index d8ee9c356c..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/OrdersRestController.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import io.dapr.client.DaprClient;
-import io.dapr.client.domain.ExecuteStateTransactionRequest;
-import io.dapr.client.domain.State;
-import io.dapr.client.domain.TransactionalStateOperation;
-import io.dapr.spring6.data.repository.config.EnableDaprRepositories;
-import io.dapr.spring.messaging.DaprMessagingTemplate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-@RestController
-@EnableDaprRepositories
-public class OrdersRestController {
-
- private static final Logger logger = LoggerFactory.getLogger(OrdersRestController.class);
-
- @Autowired
- private OrderRepository repository;
-
- @Autowired
- private DaprMessagingTemplate messagingTemplate;
-
- @Autowired
- private DaprClient daprClient;
-
- /**
- * Store orders from customers.
- * @param order from the customer
- *
- * @return confirmation that the order was stored and the event published
- */
- @PostMapping("/orders")
- public String storeOrder(@RequestBody Order order) {
- logger.info("Storing Order: " + order);
- repository.save(order);
- logger.info("Publishing Order Event: " + order);
- messagingTemplate.send("topic", order);
- return "Order Stored and Event Published";
- }
-
- @PostMapping("/orders/outbox")
- public String storeOrderOutbox(@RequestBody Order order) {
- logger.info("Storing Order with Outbox: {}", order);
- ExecuteStateTransactionRequest transactionRequest = new ExecuteStateTransactionRequest("kvstore-outbox");
-
- State state = new State<>(
- order.getId(), order, null
- );
-
- TransactionalStateOperation operation = new TransactionalStateOperation<>(
- TransactionalStateOperation.OperationType.UPSERT, state
- );
-
- transactionRequest.setOperations(List.of(operation));
-
- daprClient.executeStateTransaction(transactionRequest).block();
-
- logger.info("Order Stored with Outbox: {}", order);
-
- return "Order Stored with Outbox";
- }
-
- @GetMapping("/orders")
- public Iterable getAll() {
- return repository.findAll();
- }
-
- @GetMapping("/orders/byItem/")
- public Iterable getAllByItem(@RequestParam("item") String item) {
- return repository.findByItem(item);
- }
-
- @GetMapping("/orders/byAmount/")
- public Iterable getAllByItem(@RequestParam("amount") Integer amount) {
- return repository.findByAmount(amount);
- }
-
-
-}
-
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/ProducerAppConfiguration.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/ProducerAppConfiguration.java
deleted file mode 100644
index 3a214c92f0..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/ProducerAppConfiguration.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import io.dapr.client.DaprClient;
-import io.dapr.spring.boot.properties.pubsub.DaprPubSubProperties;
-import io.dapr.spring.boot.properties.statestore.DaprStateStoreProperties;
-import io.dapr.spring6.data.DaprKeyValueAdapterResolver;
-import io.dapr.spring6.data.DaprKeyValueTemplate;
-import io.dapr.spring6.data.KeyValueAdapterResolver;
-import io.dapr.spring.messaging.DaprMessagingTemplate;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@EnableConfigurationProperties({DaprPubSubProperties.class, DaprStateStoreProperties.class})
-public class ProducerAppConfiguration {
- @Bean
- public ObjectMapper mapper() {
- return new ObjectMapper();
- }
-
-
- /**
- * Produce a KeyValueAdapterResolver for Dapr.
- * @param daprClient dapr client
- * @param mapper object mapper
- * @param daprStatestoreProperties properties to configure state store
- * @return KeyValueAdapterResolver
- */
- @Bean
- public KeyValueAdapterResolver keyValueAdapterResolver(DaprClient daprClient, ObjectMapper mapper,
- DaprStateStoreProperties daprStatestoreProperties) {
- String storeName = daprStatestoreProperties.getName();
- String bindingName = daprStatestoreProperties.getBinding();
-
- return new DaprKeyValueAdapterResolver(daprClient, mapper, storeName, bindingName);
- }
-
- @Bean
- public DaprKeyValueTemplate daprKeyValueTemplate(KeyValueAdapterResolver keyValueAdapterResolver) {
- return new DaprKeyValueTemplate(keyValueAdapterResolver);
- }
-
- @Bean
- public DaprMessagingTemplate messagingTemplate(DaprClient daprClient,
- DaprPubSubProperties daprPubSubProperties) {
- return new DaprMessagingTemplate<>(daprClient, daprPubSubProperties.getName(), false);
- }
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/ProducerApplication.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/ProducerApplication.java
deleted file mode 100644
index bbfccc5160..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/ProducerApplication.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class ProducerApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(ProducerApplication.class, args);
- }
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/CustomerFollowupActivity.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/CustomerFollowupActivity.java
deleted file mode 100644
index 8cfc6c1306..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/CustomerFollowupActivity.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer.workflow;
-
-import io.dapr.springboot4.examples.producer.Customer;
-import io.dapr.springboot4.examples.producer.CustomerStore;
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-@Component
-public class CustomerFollowupActivity implements WorkflowActivity {
-
- private final Logger logger = LoggerFactory.getLogger(CustomerFollowupActivity.class);
-
- private final CustomerStore customerStore;
-
- public CustomerFollowupActivity(CustomerStore customerStore) {
- this.customerStore = customerStore;
- }
-
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Customer customer = ctx.getInput(Customer.class);
- //Let's get the hydrate the real customer from the CustomerStore
- customer = customerStore.getCustomer(customer.getCustomerName());
- customer.setFollowUp(true);
- customerStore.addCustomer(customer);
- logger.info("Customer: " + customer.getCustomerName() + " follow-up done.");
- return customer;
- }
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/CustomerWorkflow.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/CustomerWorkflow.java
deleted file mode 100644
index 04d5b2161c..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/CustomerWorkflow.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer.workflow;
-
-import io.dapr.springboot4.examples.producer.Customer;
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-import java.time.Duration;
-
-@Component
-public class CustomerWorkflow implements Workflow {
-
- @Override
- public WorkflowStub create() {
- return ctx -> {
- String instanceId = ctx.getInstanceId();
- Customer customer = ctx.getInput(Customer.class);
- customer.setWorkflowId(instanceId);
- ctx.getLogger().info("Let's register the customer: " + customer.getCustomerName());
- ctx.callActivity(RegisterCustomerActivity.class.getName(), customer, Customer.class).await();
- ctx.getLogger().info("Let's wait for the customer: " + customer.getCustomerName() + " to request a follow up.");
- customer = ctx.waitForExternalEvent("CustomerReachOut", Duration.ofMinutes(5), Customer.class).await();
- ctx.getLogger().info("Let's book a follow up for the customer: " + customer.getCustomerName());
- customer = ctx.callActivity(CustomerFollowupActivity.class.getName(), customer, Customer.class).await();
- ctx.getLogger().info("Congratulations the customer: " + customer.getCustomerName() + " is happy!");
- ctx.complete(customer);
- };
- }
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/RegisterCustomerActivity.java b/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/RegisterCustomerActivity.java
deleted file mode 100644
index c1e92a535e..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/workflow/RegisterCustomerActivity.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer.workflow;
-
-
-import io.dapr.springboot4.examples.producer.Customer;
-import io.dapr.springboot4.examples.producer.CustomerStore;
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-@Component
-public class RegisterCustomerActivity implements WorkflowActivity {
-
- private final Logger logger = LoggerFactory.getLogger(RegisterCustomerActivity.class);
- private final CustomerStore customerStore;
-
- public RegisterCustomerActivity(CustomerStore customerStore) {
- this.customerStore = customerStore;
- }
-
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Customer customer = ctx.getInput(Customer.class);
- customer.setInCustomerDB(true);
- logger.info("Customer: " + customer.getCustomerName() + " registered.");
- customerStore.addCustomer(customer);
- return customer;
- }
-
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/main/resources/application.properties b/spring-boot-4-examples/producer-app/src/main/resources/application.properties
deleted file mode 100644
index 1498965c7d..0000000000
--- a/spring-boot-4-examples/producer-app/src/main/resources/application.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-spring.application.name=producer-app
-dapr.pubsub.name=pubsub
-dapr.statestore.name=kvstore
-dapr.statestore.binding=kvbinding
diff --git a/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/DaprTestContainersConfig.java b/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/DaprTestContainersConfig.java
deleted file mode 100644
index 8d5624c5a3..0000000000
--- a/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/DaprTestContainersConfig.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import io.dapr.testcontainers.Component;
-import io.dapr.testcontainers.DaprContainer;
-import io.dapr.testcontainers.Subscription;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.env.Environment;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.containers.Network;
-import org.testcontainers.postgresql.PostgreSQLContainer;
-import org.testcontainers.rabbitmq.RabbitMQContainer;
-import org.testcontainers.utility.DockerImageName;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static io.dapr.testcontainers.DaprContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
-
-@TestConfiguration(proxyBeanMethods = false)
-public class DaprTestContainersConfig {
-
- static final String CONNECTION_STRING =
- "host=postgres user=postgres password=password port=5432 connect_timeout=10 database=dapr_db_repository";
- static final Map STATE_STORE_PROPERTIES = createStateStoreProperties();
- static final Map STATE_STORE_OUTBOX_PROPERTIES = createStateStoreOutboxProperties();
- static final Map BINDING_PROPERTIES = Collections.singletonMap("connectionString", CONNECTION_STRING);
-
-
- @Bean
- public Network getDaprNetwork(Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- if (reuse) {
- Network defaultDaprNetwork = new Network() {
- @Override
- public String getId() {
- return "dapr-network";
- }
-
- @Override
- public void close() {
-
- }
- };
-
- List networks = DockerClientFactory.instance().client().listNetworksCmd()
- .withNameFilter("dapr-network").exec();
- if (networks.isEmpty()) {
- Network.builder().createNetworkCmdModifier(cmd -> cmd.withName("dapr-network")).build().getId();
- return defaultDaprNetwork;
- } else {
- return defaultDaprNetwork;
- }
- } else {
- return Network.newNetwork();
- }
- }
-
-
- @Bean
- public RabbitMQContainer rabbitMQContainer(Network daprNetwork, Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- return new RabbitMQContainer(DockerImageName.parse("rabbitmq:3.7.25-management-alpine"))
- .withExposedPorts(5672)
- .withNetworkAliases("rabbitmq")
- .withReuse(reuse)
- .withNetwork(daprNetwork);
-
- }
-
- @Bean
- public PostgreSQLContainer postgreSQLContainer(Network daprNetwork) {
- return new PostgreSQLContainer("postgres:16-alpine")
- .withNetworkAliases("postgres")
- .withDatabaseName("dapr_db_repository")
- .withUsername("postgres")
- .withPassword("password")
- .withExposedPorts(5432)
- .withNetwork(daprNetwork);
-
- }
-
- @Bean
- @ServiceConnection
- public DaprContainer daprContainer(Network daprNetwork, PostgreSQLContainer postgreSQLContainer, RabbitMQContainer rabbitMQContainer) {
-
- Map rabbitMqProperties = new HashMap<>();
- rabbitMqProperties.put("connectionString", "amqp://guest:guest@rabbitmq:5672");
- rabbitMqProperties.put("user", "guest");
- rabbitMqProperties.put("password", "guest");
-
- return new DaprContainer(DAPR_RUNTIME_IMAGE_TAG)
- .withAppName("producer-app")
- .withNetwork(daprNetwork)
- .withComponent(new Component("kvstore", "state.postgresql", "v1", STATE_STORE_PROPERTIES))
- .withComponent(new Component("kvbinding", "bindings.postgresql", "v1", BINDING_PROPERTIES))
- .withComponent(new Component("pubsub", "pubsub.rabbitmq", "v1", rabbitMqProperties))
- .withComponent(new Component("kvstore-outbox", "state.postgresql", "v1", STATE_STORE_OUTBOX_PROPERTIES))
- .withSubscription(new Subscription("app", "pubsub", "topic", "/subscribe"))
- .withAppPort(8080)
- .withAppHealthCheckPath("/actuator/health")
- .withAppChannelAddress("host.testcontainers.internal")
- .dependsOn(rabbitMQContainer)
- .dependsOn(postgreSQLContainer);
- }
-
-
- private static Map createStateStoreProperties() {
- Map result = new HashMap<>();
-
- result.put("keyPrefix", "name");
- result.put("actorStateStore", String.valueOf(true));
- result.put("connectionString", CONNECTION_STRING);
-
- return result;
- }
-
- private static Map createStateStoreOutboxProperties() {
- Map result = new HashMap<>();
- result.put("connectionString", CONNECTION_STRING);
- result.put("outboxPublishPubsub", "pubsub");
- result.put("outboxPublishTopic", "outbox-topic");
-
- return result;
- }
-
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/ProducerAppIT.java b/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/ProducerAppIT.java
deleted file mode 100644
index e47dad3554..0000000000
--- a/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/ProducerAppIT.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import io.dapr.client.DaprClient;
-import io.dapr.springboot.DaprAutoConfiguration;
-import io.dapr.springboot4.examples.producer.Customer;
-import io.dapr.springboot4.examples.producer.CustomerStore;
-import io.dapr.springboot4.examples.producer.OrderDTO;
-import io.dapr.springboot4.examples.producer.workflow.CustomerFollowupActivity;
-import io.dapr.springboot4.examples.producer.workflow.CustomerWorkflow;
-import io.dapr.springboot4.examples.producer.workflow.RegisterCustomerActivity;
-import io.dapr.testcontainers.DaprContainer;
-import io.dapr.testcontainers.wait.strategy.DaprWait;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.web.server.LocalServerPort;
-import org.springframework.core.ParameterizedTypeReference;
-import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.client.RestTestClient;
-
-import java.time.Duration;
-import java.util.List;
-
-import static org.awaitility.Awaitility.await;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-@SpringBootTest(classes = {TestProducerApplication.class, DaprTestContainersConfig.class,
- DaprAutoConfiguration.class, CustomerWorkflow.class, CustomerFollowupActivity.class,
- RegisterCustomerActivity.class, CustomerStore.class},
- webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
-class ProducerAppIT {
-
- @Autowired
- private TestSubscriberRestController controller;
-
- @Autowired
- private CustomerStore customerStore;
-
- @Autowired
- private DaprClient daprClient;
-
- @Autowired
- private DaprContainer daprContainer;
-
- @LocalServerPort
- private int port;
-
- private RestTestClient client;
-
- @BeforeEach
- void setUp() {
- client = RestTestClient.bindToServer()
- .baseUrl("http://localhost:" + port)
- .build();
-
- org.testcontainers.Testcontainers.exposeHostPorts(8080);
- DaprWait.forSubscription("pubsub", "topic").waitUntilReady(daprContainer);
- }
-
- @AfterEach
- void cleanUp() {
- controller.getAllEvents().clear();
- }
-
- @Test
- void testOrdersOutboxEndpointAndMessaging() {
- OrderDTO order = new OrderDTO("outbox-order-123", "Lorem ipsum", 1000);
-
- client.post()
- .uri("/orders/outbox")
- .contentType(MediaType.APPLICATION_JSON)
- .body(order)
- .exchange()
- .expectStatus().isOk();
-
- await().atMost(Duration.ofSeconds(15))
- .until(controller.getAllEvents()::size, equalTo(1));
-
- }
-
-// @Test
-// void testOrdersEndpointAndMessaging() {
-// OrderDTO order = new OrderDTO("abc-123", "the mars volta LP", 1);
-//
-// client.post()
-// .uri("/orders")
-// .contentType(MediaType.APPLICATION_JSON)
-// .body(order)
-// .exchange()
-// .expectStatus().isOk();
-//
-// await().atMost(Duration.ofSeconds(15))
-// .until(controller.getAllEvents()::size, equalTo(1));
-//
-// // Get all orders
-// List orders = client.get()
-// .uri("/orders")
-// .exchange()
-// .expectStatus().isOk()
-// .returnResult(new ParameterizedTypeReference>() {})
-// .getResponseBody();
-//
-// assertNotNull(orders);
-// assertEquals(1, orders.size());
-//
-// // Query by item
-// List ordersByItem = client.get()
-// .uri(uriBuilder -> uriBuilder
-// .path("/orders/byItem/")
-// .queryParam("item", "the mars volta LP")
-// .build())
-// .exchange()
-// .expectStatus().isOk()
-// .returnResult(new ParameterizedTypeReference>() {})
-// .getResponseBody();
-//
-// assertNotNull(ordersByItem);
-// assertEquals(1, ordersByItem.size());
-//
-// // Query by item - no match
-// List ordersByOtherItem = client.get()
-// .uri(uriBuilder -> uriBuilder
-// .path("/orders/byItem/")
-// .queryParam("item", "other")
-// .build())
-// .exchange()
-// .expectStatus().isOk()
-// .returnResult(new ParameterizedTypeReference>() {})
-// .getResponseBody();
-//
-// assertNotNull(ordersByOtherItem);
-// assertEquals(0, ordersByOtherItem.size());
-//
-// // Query by amount
-// List ordersByAmount = client.get()
-// .uri(uriBuilder -> uriBuilder
-// .path("/orders/byAmount/")
-// .queryParam("amount", 1)
-// .build())
-// .exchange()
-// .expectStatus().isOk()
-// .returnResult(new ParameterizedTypeReference>() {})
-// .getResponseBody();
-//
-// assertNotNull(ordersByAmount);
-// assertEquals(1, ordersByAmount.size());
-//
-// // Query by amount - no match
-// List ordersByOtherAmount = client.get()
-// .uri(uriBuilder -> uriBuilder
-// .path("/orders/byAmount/")
-// .queryParam("amount", 2)
-// .build())
-// .exchange()
-// .expectStatus().isOk()
-// .returnResult(new ParameterizedTypeReference>() {})
-// .getResponseBody();
-//
-// assertNotNull(ordersByOtherAmount);
-// assertEquals(0, ordersByOtherAmount.size());
-//
-// }
-
- @Test
- void testCustomersWorkflows() {
-
- client.post()
- .uri("/customers")
- .contentType(MediaType.APPLICATION_JSON)
- .body("{\"customerName\": \"salaboy\"}")
- .exchange()
- .expectStatus().isOk();
-
-
- await().atMost(Duration.ofSeconds(15))
- .until(customerStore.getCustomers()::size, equalTo(1));
- Customer customer = customerStore.getCustomer("salaboy");
- assertTrue(customer.isInCustomerDB());
- String workflowId = customer.getWorkflowId();
-
- client.post()
- .uri("/customers/followup")
- .contentType(MediaType.APPLICATION_JSON)
- .body("{ \"workflowId\": \"" + workflowId + "\",\"customerName\": \"salaboy\" }")
- .exchange()
- .expectStatus().isOk();
-
- assertEquals(1, customerStore.getCustomers().size());
-
- await().atMost(Duration.ofSeconds(10))
- .until(customerStore.getCustomer("salaboy")::isFollowUp, equalTo(true));
-
- }
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/TestProducerApplication.java b/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/TestProducerApplication.java
deleted file mode 100644
index b3b29abaa1..0000000000
--- a/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/TestProducerApplication.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import io.dapr.springboot4.examples.producer.ProducerApplication;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class TestProducerApplication {
-
- public static void main(String[] args) {
-
- SpringApplication.from(ProducerApplication::main)
- .with(DaprTestContainersConfig.class)
- .run(args);
- org.testcontainers.Testcontainers.exposeHostPorts(8080);
- }
-
-}
diff --git a/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/TestSubscriberRestController.java b/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/TestSubscriberRestController.java
deleted file mode 100644
index 08757fe396..0000000000
--- a/spring-boot-4-examples/producer-app/src/test/java/io/dapr/springboot4/examples/producer/TestSubscriberRestController.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.producer;
-
-import io.dapr.Topic;
-import io.dapr.client.domain.CloudEvent;
-import io.dapr.springboot4.examples.producer.Order;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RestController
-public class TestSubscriberRestController {
-
- private List events = new ArrayList<>();
-
- private final Logger logger = LoggerFactory.getLogger(TestSubscriberRestController.class);
-
- @PostMapping("subscribe")
- @Topic(pubsubName = "pubsub", name = "topic")
- public void subscribe(@RequestBody CloudEvent cloudEvent){
- logger.info("Order Event Received: " + cloudEvent.getData());
- events.add(cloudEvent);
- }
-
- @PostMapping("outbox-subscribe")
- @Topic(pubsubName = "pubsub", name = "outbox-topic")
- public void outboxSubscribe(@RequestBody CloudEvent cloudEvent) {
- // we are receiving the Order with CloudEvent as String due to the
- // following issue https://github.com/dapr/java-sdk/issues/1580
- logger.info("Outbox Order Event Received: " + cloudEvent.getData());
- events.add(cloudEvent);
- }
-
- public List getAllEvents() {
- return events;
- }
-}
-
diff --git a/spring-boot-4-examples/workflows/multi-app/README.md b/spring-boot-4-examples/workflows/multi-app/README.md
deleted file mode 100644
index 70af5a1681..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/README.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# Multi App workflow Example
-
-This example demonstrates how you can create distributed workflows where the orchestrator doesn't host the workflow activities.
-
-For more documentation about how Multi App Workflows work [check the official documentation here](https://v1-16.docs.dapr.io/developing-applications/building-blocks/workflow/workflow-multi-app/).
-
-This example is composed by three Spring Boot applications:
-- `orchestrator`: The `orchestrator` app contains the Dapr Workflow definition and expose REST endpoints to create and raise events against workflow instances.
-- `worker-one`: The `worker-one` app contains the `RegisterCustomerActivity` definition, which will be called by the `orchestrator` app.
-- `worker-two`: The `worker-two` app contains the `CustomerFollowupActivity` definition, which will be called by the `orchestrator` app.
-
-To start the applications you need to run the following commands on separate terminals, starting from the `multi-app` directory.
-To start the `orchestrator` app run:
-```bash
-cd orchestrator/
-mvn -Dspring-boot.run.arguments="--reuse=true" clean spring-boot:test-run
-```
-
-The `orchestrator` application will run on port `8080`.
-
-On a separate terminal, to start the `worker-one` app run:
-```bash
-cd worker-one/
-mvn -Dspring-boot.run.arguments="--reuse=true" clean spring-boot:test-run
-```
-
-The `worker-one` application will run on port `8081`.
-
-On a separate terminal, to start the `worker-two` app run:
-```bash
-cd worker-two/
-mvn -Dspring-boot.run.arguments="--reuse=true" clean spring-boot:test-run
-```
-
-The `worker-two` application will run on port `8082`.
-
-You can create new workflow instances of the `CustomerWorkflow` by calling the `/customers` endpoint of the `orchestrator` application.
-
-```bash
-curl -X POST localhost:8080/customers -H 'Content-Type: application/json' -d '{ "customerName": "salaboy" }'
-```
-
-The workflow definition [`CustomerWorkflow`](orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/CustomerWorkflow.java) that you can find inside the `orchestrator` app,
-performs the following orchestration when a new workflow instance is created:
-
-- Call the `RegisterCustomerActivity` activity which can be found inside the `worker-one` application.
- - You can find in the workflow definition the configuration to make reference to an Activity that is hosted by a different Dapr application.
- ```java
- customer = ctx.callActivity("io.dapr.springboot.examples.workerone.RegisterCustomerActivity",
- customer,
- new WorkflowTaskOptions("worker-one"),
- Customer.class).
- await();
- ```
-- Wait for an external event of type `CustomerReachOut` with a timeout of 5 minutes:
- ```java
- ctx.waitForExternalEvent("CustomerReachOut", Duration.ofMinutes(5), Customer.class).await();
- ```
-- You can check the status of the workflow for a given customer by sending the following request:
- ```shell
- curl -X POST localhost:8080/customers/status -H 'Content-Type: application/json' -d '{ "customerName": "salaboy" }'
- ```
-- You can call the following endpoint on the `orchestrator` app to raise the external event:
- ```shell
- curl -X POST localhost:8080/customers/followup -H 'Content-Type: application/json' -d '{ "customerName": "salaboy" }'
- ```
-- When the event is received, the workflow move forward to the last activity called `CustomerFollowUpActivity`, that can be found on the `worker-two` app.
- ```java
- customer = ctx.callActivity("io.dapr.springboot.examples.workertwo.CustomerFollowupActivity",
- customer,
- new WorkflowTaskOptions("worker-two"),
- Customer.class).
- await();
- ```
-- The workflow completes by handing out the final version of the `Customer` object that has been modified the workflow activities. You can retrieve the `Customer` payload
- by running the following command:
- ```shell
- curl -X POST localhost:8080/customers/output -H 'Content-Type: application/json' -d '{ "customerName": "salaboy" }'
- ```
-
-## Testing Multi App Workflows
-
-Testing becomes a complex task when you are dealing with multiple Spring Boot applications. For testing this workflow,
-we rely on [Testcontainers](https://testcontainers.com) to create the entire setup which enable us to run the workflow end to end.
-
-You can find the end-to-end test in the [`OrchestratorAppIT.java`](orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/OrchestratorAppIT.java) class inside the `orchestrator` application.
-This test interact with the application REST endpoints to validate their correct execution.
-
-But the magic behind the test can be located in the [`DaprTestContainersConfig.class`](orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/DaprTestContainersConfig.java) which defines the configuration for
-all the Dapr containers and the `worker-one` and `worker-two` applications. Check this class to gain a deeper understand how to configure
-multiple Dapr-enabled applications.
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/pom.xml b/spring-boot-4-examples/workflows/multi-app/orchestrator/pom.xml
deleted file mode 100644
index 004fe3c708..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/pom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
- 4.0.0
-
-
- io.dapr
- sb4-multi-app
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- sb4-orchestrator
- sb4-orchestrator
- Spring Boot 4, Testcontainers and Dapr Integration Examples :: Orchestrator App
-
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
- org.springframework.boot
- spring-boot-starter-webmvc
-
-
- org.springframework.boot
- spring-boot-starter-webmvc-test
- test
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter-test
- test
-
-
- com.redis
- testcontainers-redis
- test
-
-
-
- io.dapr
- sb4-worker-one
- ${project.version}
- test
-
-
- io.dapr
- sb4-worker-two
- ${project.version}
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
- org.apache.maven.plugins
- maven-failsafe-plugin
-
-
-
- integration-test
- verify
-
-
-
-
-
- **/*IT.java
-
-
-
-
-
-
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/Customer.java b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/Customer.java
deleted file mode 100644
index 89aac208eb..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/Customer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.orchestrator;
-
-public class Customer {
- private String customerName;
- private String workflowId;
- private boolean inCustomerDB = false;
- private boolean followUp = false;
-
- public boolean isFollowUp() {
- return followUp;
- }
-
- public void setFollowUp(boolean followUp) {
- this.followUp = followUp;
- }
-
- public boolean isInCustomerDB() {
- return inCustomerDB;
- }
-
- public void setInCustomerDB(boolean inCustomerDB) {
- this.inCustomerDB = inCustomerDB;
- }
-
- public String getWorkflowId() {
- return workflowId;
- }
-
- public void setWorkflowId(String workflowId) {
- this.workflowId = workflowId;
- }
-
- public String getCustomerName() {
- return customerName;
- }
-
- public void setCustomerName(String customerName) {
- this.customerName = customerName;
- }
-
- @Override
- public String toString() {
- return "Customer [customerName=" + customerName + ", workflowId=" + workflowId + ", inCustomerDB="
- + inCustomerDB + ", followUp=" + followUp + "]";
- }
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/CustomerWorkflow.java b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/CustomerWorkflow.java
deleted file mode 100644
index 2498c9ddb0..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/CustomerWorkflow.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.orchestrator;
-
-import io.dapr.durabletask.TaskCanceledException;
-import io.dapr.durabletask.TaskFailedException;
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import io.dapr.workflows.WorkflowTaskOptions;
-import org.springframework.stereotype.Component;
-
-import java.time.Duration;
-
-@Component
-public class CustomerWorkflow implements Workflow {
-
- @Override
- public WorkflowStub create() {
- return ctx -> {
- String instanceId = ctx.getInstanceId();
- Customer customer = ctx.getInput(Customer.class);
- customer.setWorkflowId(instanceId);
- ctx.getLogger().info("Let's register the customer: {}", customer.getCustomerName());
-
- customer = ctx.callActivity("io.dapr.springboot4.examples.workerone.RegisterCustomerActivity", customer,
- new WorkflowTaskOptions("worker-one"), Customer.class).await();
-
- ctx.getLogger().info("Let's wait for the customer: {} to request a follow up.", customer.getCustomerName());
- ctx.waitForExternalEvent("CustomerReachOut", Duration.ofMinutes(5), Customer.class).await();
-
- ctx.getLogger().info("Let's book a follow up for the customer: {}", customer.getCustomerName());
- customer = ctx.callActivity("io.dapr.springboot4.examples.workertwo.CustomerFollowupActivity",
- customer, new WorkflowTaskOptions("worker-two"), Customer.class).await();
-
- ctx.getLogger().info("Congratulations the customer: {} is happy!", customer.getCustomerName());
-
- ctx.getLogger().info("Final customer: {} ", customer);
- ctx.complete(customer);
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/CustomersRestController.java b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/CustomersRestController.java
deleted file mode 100644
index fb0b779e6e..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/CustomersRestController.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.orchestrator;
-
-import io.dapr.workflows.client.DaprWorkflowClient;
-import io.dapr.workflows.client.WorkflowState;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@RestController
-public class CustomersRestController {
-
- private final Logger logger = LoggerFactory.getLogger(CustomersRestController.class);
-
- @Autowired
- private DaprWorkflowClient daprWorkflowClient;
-
- @GetMapping("/")
- public String root() {
- return "OK";
- }
-
- private final Map customersWorkflows = new HashMap<>();
-
- /**
- * Track customer endpoint.
- *
- * @param customer provided customer to track
- * @return confirmation that the workflow instance was created for a given customer
- */
- @PostMapping("/customers")
- public String trackCustomer(@RequestBody Customer customer) {
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(CustomerWorkflow.class, customer);
- logger.info("Workflow instance {} started", instanceId);
- customersWorkflows.put(customer.getCustomerName(), instanceId);
- return "New Workflow Instance created for Customer: " + customer.getCustomerName();
- }
-
- /**
- * Request customer follow-up.
- * @param customer associated with a workflow instance
- * @return confirmation that the follow-up was requested
- */
- @PostMapping("/customers/followup")
- public String customerNotification(@RequestBody Customer customer) {
- logger.info("Customer follow-up requested: {}", customer.getCustomerName());
- String workflowIdForCustomer = customersWorkflows.get(customer.getCustomerName());
- if (workflowIdForCustomer == null || workflowIdForCustomer.isEmpty()) {
- return "There is no workflow associated with customer: " + customer.getCustomerName();
- }
- daprWorkflowClient.raiseEvent(workflowIdForCustomer, "CustomerReachOut", customer);
- return "Customer Follow-up requested";
- }
-
- /**
- * Request customer workflow instance status.
- * @param customer associated with a workflow instance
- * @return the workflow instance status for a given customer
- */
- @PostMapping("/customers/status")
- public String getCustomerStatus(@RequestBody Customer customer) {
- logger.info("Customer status requested: {}", customer.getCustomerName());
- String workflowIdForCustomer = customersWorkflows.get(customer.getCustomerName());
- if (workflowIdForCustomer == null || workflowIdForCustomer.isEmpty()) {
- return "N/A";
- }
- WorkflowState instanceState = daprWorkflowClient.getWorkflowState(workflowIdForCustomer, true);
- assert instanceState != null;
- return "Workflow for Customer: " + customer.getCustomerName() + " is " + instanceState.getRuntimeStatus().name();
- }
-
- /**
- * Request customer output.
- * @param customer associated with a workflow instance
- * @return Customer status after the workflow execution finished
- */
- @PostMapping("/customers/output")
- public Customer getCustomerOutput(@RequestBody Customer customer) {
- logger.info("Customer output requested: {}", customer.getCustomerName());
- String workflowIdForCustomer = customersWorkflows.get(customer.getCustomerName());
- if (workflowIdForCustomer == null || workflowIdForCustomer.isEmpty()) {
- return null;
- }
- WorkflowState instanceState = daprWorkflowClient.getWorkflowState(workflowIdForCustomer, true);
- assert instanceState != null;
- return instanceState.readOutputAs(Customer.class);
- }
-
-}
-
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/OrchestratorApplication.java b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/OrchestratorApplication.java
deleted file mode 100644
index c1f58f8b8d..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/OrchestratorApplication.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.orchestrator;
-
-import io.dapr.spring.workflows.config.EnableDaprWorkflows;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-@EnableDaprWorkflows
-public class OrchestratorApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(OrchestratorApplication.class, args);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/resources/application.properties b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/resources/application.properties
deleted file mode 100644
index 3d555d71e5..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-spring.application.name=orchestrator
\ No newline at end of file
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/DaprTestContainersConfig.java b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/DaprTestContainersConfig.java
deleted file mode 100644
index ed6619e03f..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/DaprTestContainersConfig.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.orchestrator;
-
-import com.redis.testcontainers.RedisContainer;
-import io.dapr.testcontainers.*;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.env.Environment;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.Network;
-import org.testcontainers.containers.wait.strategy.Wait;
-import org.testcontainers.utility.DockerImageName;
-import org.testcontainers.utility.MountableFile;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static io.dapr.testcontainers.DaprContainerConstants.*;
-
-@TestConfiguration(proxyBeanMethods = false)
-public class DaprTestContainersConfig {
-
- @Bean
- public Network getDaprNetwork(Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- if (reuse) {
- Network defaultDaprNetwork = new Network() {
- @Override
- public String getId() {
- return "dapr-network";
- }
-
- @Override
- public void close() {
-
- }
- };
-
- List networks = DockerClientFactory.instance().client().listNetworksCmd()
- .withNameFilter("dapr-network").exec();
- if (networks.isEmpty()) {
- Network.builder().createNetworkCmdModifier(cmd -> cmd.withName("dapr-network")).build().getId();
- return defaultDaprNetwork;
- } else {
- return defaultDaprNetwork;
- }
- } else {
- return Network.newNetwork();
- }
- }
-
- private Map getRedisProps(){
- Map redisProps = new HashMap<>();
- redisProps.put("redisHost", "redis:6379");
- redisProps.put("redisPassword", "");
- redisProps.put("actorStateStore", String.valueOf(true));
- return redisProps;
- }
-
- @Bean
- public DaprPlacementContainer placementContainer(Network daprNetwork, Environment env){
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- return new DaprPlacementContainer(DockerImageName.parse(DAPR_PLACEMENT_IMAGE_TAG))
- .withNetwork(daprNetwork)
- .withReuse(reuse)
- .withNetworkAliases("placement");
- }
-
- @Bean
- public DaprSchedulerContainer schedulerContainer(Network daprNetwork, Environment env){
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- return new DaprSchedulerContainer(DockerImageName.parse(DAPR_SCHEDULER_IMAGE_TAG))
- .withNetwork(daprNetwork)
- .withReuse(reuse)
- .withNetworkAliases("scheduler");
- }
-
- @Bean("workerOneDapr")
- @ConditionalOnProperty(prefix = "tests", name = "workers.enabled", havingValue = "true")
- public DaprContainer workerOneDapr(Network daprNetwork, RedisContainer redisContainer, Environment env,
- DaprPlacementContainer daprPlacementContainer,
- DaprSchedulerContainer daprSchedulerContainer) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- return new DaprContainer(DAPR_RUNTIME_IMAGE_TAG)
- .withAppName("worker-one")
- .withNetworkAliases("worker-one")
- .withNetwork(daprNetwork)
- .withPlacementContainer(daprPlacementContainer)
- .withSchedulerContainer(daprSchedulerContainer)
- .withComponent(new Component("kvstore", "state.redis", "v1", getRedisProps()))
- .dependsOn(daprPlacementContainer)
- .dependsOn(daprSchedulerContainer)
- .dependsOn(redisContainer);
- }
-
- @Bean
- @ConditionalOnProperty(prefix = "tests", name = "workers.enabled", havingValue = "true")
- public GenericContainer> workerOneContainer(Network daprNetwork,
- @Qualifier("workerOneDapr") DaprContainer workerOneDapr,
- DaprPlacementContainer daprPlacementContainer,
- DaprSchedulerContainer daprSchedulerContainer){
- return new GenericContainer<>(DockerImages.JDK_17_TEMURIN_JAMMY)
- .withCopyFileToContainer(MountableFile.forHostPath("../worker-one/target"), "/app")
- .withWorkingDirectory("/app")
- .withCommand("java",
- "-Ddapr.grpc.endpoint=worker-one:50001",
- "-Ddapr.http.endpoint=worker-one:3500",
- "-jar",
- "worker-one.jar")
- .withNetwork(daprNetwork)
- .dependsOn(workerOneDapr)
- .dependsOn(daprPlacementContainer)
- .dependsOn(daprSchedulerContainer)
- .waitingFor(Wait.forLogMessage(".*Started WorkerOneApplication.*", 1))
- .withLogConsumer(outputFrame -> System.out.println("WorkerOneApplication: " + outputFrame.getUtf8String()));
- }
-
- @Bean("workerTwoDapr")
- @ConditionalOnProperty(prefix = "tests", name = "workers.enabled", havingValue = "true")
- public DaprContainer workerTwoDapr(Network daprNetwork, RedisContainer redisContainer,
- Environment env,
- DaprPlacementContainer daprPlacementContainer,
- DaprSchedulerContainer daprSchedulerContainer) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
-
- return new DaprContainer(DAPR_RUNTIME_IMAGE_TAG)
- .withAppName("worker-two")
- .withNetworkAliases("worker-two")
- .withNetwork(daprNetwork)
- .withPlacementContainer(daprPlacementContainer)
- .withSchedulerContainer(daprSchedulerContainer)
- .withComponent(new Component("kvstore", "state.redis", "v1", getRedisProps()))
- .dependsOn(daprPlacementContainer)
- .dependsOn(daprSchedulerContainer)
- .dependsOn(redisContainer);
- }
-
- @Bean
- @ConditionalOnProperty(prefix = "tests", name = "workers.enabled", havingValue = "true")
- public GenericContainer> workerTwoContainer(Network daprNetwork,
- @Qualifier("workerTwoDapr") DaprContainer workerTwoDapr,
- DaprPlacementContainer daprPlacementContainer,
- DaprSchedulerContainer daprSchedulerContainer){
- return new GenericContainer<>(DockerImages.JDK_17_TEMURIN_JAMMY)
- .withCopyFileToContainer(MountableFile.forHostPath("../worker-two/target"), "/app")
- .withWorkingDirectory("/app")
- .withCommand("java",
- "-Ddapr.grpc.endpoint=worker-two:50001",
- "-Ddapr.http.endpoint=worker-two:3500",
- "-jar",
- "worker-two.jar")
- .withNetwork(daprNetwork)
- .dependsOn(workerTwoDapr)
- .dependsOn(daprPlacementContainer)
- .dependsOn(daprSchedulerContainer)
- .waitingFor(Wait.forLogMessage(".*Started WorkerTwoApplication.*", 1))
- .withLogConsumer(outputFrame -> System.out.println("WorkerTwoApplication: " + outputFrame.getUtf8String()));
- }
-
- @Bean
- public RedisContainer redisContainer(Network daprNetwork, Environment env){
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- return new RedisContainer(RedisContainer.DEFAULT_IMAGE_NAME)
- .withNetwork(daprNetwork)
- .withReuse(reuse)
- .withNetworkAliases("redis");
- }
-
- @Bean
- @ServiceConnection
- public DaprContainer daprContainer(Network daprNetwork, RedisContainer redisContainer,
- Environment env,
- DaprPlacementContainer daprPlacementContainer,
- DaprSchedulerContainer daprSchedulerContainer) {
-
- return new DaprContainer(DAPR_RUNTIME_IMAGE_TAG)
- .withAppName("orchestrator")
- .withNetwork(daprNetwork)
- .withPlacementContainer(daprPlacementContainer)
- .withSchedulerContainer(daprSchedulerContainer)
- .withComponent(new Component("kvstore", "state.redis", "v1", getRedisProps()))
- .withAppPort(8080)
- .withAppHealthCheckPath("/actuator/health")
- .withAppChannelAddress("host.testcontainers.internal")
- .dependsOn(daprPlacementContainer)
- .dependsOn(daprSchedulerContainer)
- .dependsOn(redisContainer);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/DockerImages.java b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/DockerImages.java
deleted file mode 100644
index 5a94263f39..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/DockerImages.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package io.dapr.springboot4.examples.orchestrator;
-
-public interface DockerImages {
-
- String JDK_17_TEMURIN_JAMMY = "eclipse-temurin:17-jdk-jammy";
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/OrchestratorAppIT.java b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/OrchestratorAppIT.java
deleted file mode 100644
index a4e05e8a5f..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/OrchestratorAppIT.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.orchestrator;
-
-import io.dapr.springboot4.examples.orchestrator.Customer;
-import io.dapr.springboot4.examples.orchestrator.CustomersRestController;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.web.server.LocalServerPort;
-import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.client.RestTestClient;
-
-import java.time.Duration;
-
-import static org.awaitility.Awaitility.await;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-@SpringBootTest(classes = {TestOrchestratorApplication.class, DaprTestContainersConfig.class, CustomersRestController.class},
- webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
- properties = {"reuse=false", "tests.workers.enabled=true"})
-class OrchestratorAppIT {
-
- @LocalServerPort
- private int port;
-
- private RestTestClient client;
-
- @BeforeEach
- void setUp() {
- client = RestTestClient.bindToServer()
- .baseUrl("http://localhost:" + port)
- .build();
- org.testcontainers.Testcontainers.exposeHostPorts(8080);
-
- }
-
- @Test
- void testCustomersWorkflows() throws InterruptedException {
-
- // Create a new workflow instance for a given customer
- client.post()
- .uri("/customers")
- .contentType(MediaType.APPLICATION_JSON)
- .body("{\"customerName\": \"salaboy\"}")
- .exchange()
- .expectStatus().isOk();
-
- // Wait for the workflow instance to be running by checking the status
- await().atMost(Duration.ofSeconds(5)).until(() ->
- {
- String workflowStatus = client.post()
- .uri("/customers/status")
- .contentType(MediaType.APPLICATION_JSON)
- .body("{\"customerName\": \"salaboy\" }")
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
- return "Workflow for Customer: salaboy is RUNNING".equals(workflowStatus);
- }
- );
-
- // Raise an external event to move the workflow forward
- client.post()
- .uri("/customers/followup")
- .contentType(MediaType.APPLICATION_JSON)
- .body("{\"customerName\": \"salaboy\" }")
- .exchange()
- .expectStatus().isOk();
-
- // Wait for the workflow instance to be completed by checking the status
- await().atMost(Duration.ofSeconds(5)).until(() ->
- {
- String workflowStatus = client.post()
- .uri("/customers/status")
- .contentType(MediaType.APPLICATION_JSON)
- .body("{\"customerName\": \"salaboy\" }")
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
- return "Workflow for Customer: salaboy is COMPLETED".equals(workflowStatus);
- }
- );
-
- // Get the customer after running all the workflow activities
- Customer customer = client.post()
- .uri("/customers/output")
- .contentType(MediaType.APPLICATION_JSON)
- .body("{\"customerName\": \"salaboy\" }")
- .exchange()
- .expectStatus().isOk()
- .returnResult(Customer.class)
- .getResponseBody();
-
- assertNotNull(customer);
- assertTrue(customer.isInCustomerDB());
- assertTrue(customer.isFollowUp());
-
-
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/TestOrchestratorApplication.java b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/TestOrchestratorApplication.java
deleted file mode 100644
index 915e16b159..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/TestOrchestratorApplication.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.orchestrator;
-
-import io.dapr.springboot4.examples.orchestrator.OrchestratorApplication;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class TestOrchestratorApplication {
-
- public static void main(String[] args) {
-
- SpringApplication.from(OrchestratorApplication::main)
- .with(DaprTestContainersConfig.class)
- .run(args);
- org.testcontainers.Testcontainers.exposeHostPorts(8080);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/resources/application.properties b/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/resources/application.properties
deleted file mode 100644
index ce86cb5399..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/orchestrator/src/test/resources/application.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-dapr.statestore.name=kvstore
-server.port=8080
\ No newline at end of file
diff --git a/spring-boot-4-examples/workflows/multi-app/pom.xml b/spring-boot-4-examples/workflows/multi-app/pom.xml
deleted file mode 100644
index b5318b4816..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/pom.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
- 4.0.0
-
- io.dapr
- sb4-workflows
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- sb4-multi-app
- pom
-
-
- true
-
-
-
- orchestrator
- worker-one
- worker-two
-
-
-
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
-
-
diff --git a/spring-boot-4-examples/workflows/multi-app/spotbugs-exclude.xml b/spring-boot-4-examples/workflows/multi-app/spotbugs-exclude.xml
deleted file mode 100644
index 264fc79b0a..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/spotbugs-exclude.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/pom.xml b/spring-boot-4-examples/workflows/multi-app/worker-one/pom.xml
deleted file mode 100644
index 827d056dd6..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
- 4.0.0
-
-
- io.dapr
- sb4-multi-app
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- sb4-worker-one
- sb4-worker-one
- Spring Boot 4, Testcontainers and Dapr Integration Examples :: Worker 1 App
-
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
- org.springframework.boot
- spring-boot-starter-webmvc
-
-
- org.springframework.boot
- spring-boot-starter-webmvc-test
- test
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter-test
- test
-
-
- com.redis
- testcontainers-redis
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
- worker-one
-
-
-
-
- repackage
-
-
-
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
-
-
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/Customer.java b/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/Customer.java
deleted file mode 100644
index 58c432f555..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/Customer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workerone;
-
-public class Customer {
- private String customerName;
- private String workflowId;
- private boolean inCustomerDB = false;
- private boolean followUp = false;
-
- public boolean isFollowUp() {
- return followUp;
- }
-
- public void setFollowUp(boolean followUp) {
- this.followUp = followUp;
- }
-
- public boolean isInCustomerDB() {
- return inCustomerDB;
- }
-
- public void setInCustomerDB(boolean inCustomerDB) {
- this.inCustomerDB = inCustomerDB;
- }
-
- public String getWorkflowId() {
- return workflowId;
- }
-
- public void setWorkflowId(String workflowId) {
- this.workflowId = workflowId;
- }
-
- public String getCustomerName() {
- return customerName;
- }
-
- public void setCustomerName(String customerName) {
- this.customerName = customerName;
- }
-
- @Override
- public String toString() {
- return "Customer [customerName=" + customerName + ", workflowId=" + workflowId + ", inCustomerDB="
- + inCustomerDB + ", followUp=" + followUp + "]";
- }
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/RegisterCustomerActivity.java b/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/RegisterCustomerActivity.java
deleted file mode 100644
index 61fe72903e..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/RegisterCustomerActivity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workerone;
-
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-@Component
-public class RegisterCustomerActivity implements WorkflowActivity {
-
- private final Logger logger = LoggerFactory.getLogger(RegisterCustomerActivity.class);
-
-
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Customer customer = ctx.getInput(Customer.class);
- customer.setInCustomerDB(true);
- logger.info("Customer: {} registered.", customer.getCustomerName());
- return customer;
- }
-
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/WorkerOneApplication.java b/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/WorkerOneApplication.java
deleted file mode 100644
index ad39d85a52..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/java/io/dapr/springboot4/examples/workerone/WorkerOneApplication.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workerone;
-
-import io.dapr.spring.workflows.config.EnableDaprWorkflows;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-@EnableDaprWorkflows
-public class WorkerOneApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(WorkerOneApplication.class, args);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/resources/application.properties b/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/resources/application.properties
deleted file mode 100644
index 324435fa52..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/src/main/resources/application.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-spring.application.name=worker-one
-server.port=8081
\ No newline at end of file
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/DaprTestContainersConfig.java b/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/DaprTestContainersConfig.java
deleted file mode 100644
index a0c6285d24..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/DaprTestContainersConfig.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workerone;
-
-import com.redis.testcontainers.RedisContainer;
-import io.dapr.testcontainers.Component;
-import io.dapr.testcontainers.DaprContainer;
-import io.dapr.testcontainers.DaprLogLevel;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.env.Environment;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.containers.Network;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static io.dapr.testcontainers.DaprContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
-
-@TestConfiguration(proxyBeanMethods = false)
-public class DaprTestContainersConfig {
-
- @Bean
- public Network getDaprNetwork(Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- if (reuse) {
- Network defaultDaprNetwork = new Network() {
- @Override
- public String getId() {
- return "dapr-network";
- }
-
- @Override
- public void close() {
-
- }
- };
-
- List networks = DockerClientFactory.instance().client().listNetworksCmd()
- .withNameFilter("dapr-network").exec();
- if (networks.isEmpty()) {
- Network.builder().createNetworkCmdModifier(cmd -> cmd.withName("dapr-network")).build().getId();
- return defaultDaprNetwork;
- } else {
- return defaultDaprNetwork;
- }
- } else {
- return Network.newNetwork();
- }
- }
-
- @Bean
- public RedisContainer redisContainer(Network daprNetwork, Environment env){
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- return new RedisContainer(RedisContainer.DEFAULT_IMAGE_NAME)
- .withNetwork(daprNetwork)
- .withReuse(reuse)
- .withNetworkAliases("redis");
- }
-
- @Bean
- @ServiceConnection
- public DaprContainer daprContainer(Network daprNetwork, RedisContainer redisContainer, Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- Map redisProps = new HashMap<>();
- redisProps.put("redisHost", "redis:6379");
- redisProps.put("redisPassword", "");
- redisProps.put("actorStateStore", String.valueOf(true));
-
- return new DaprContainer(DAPR_RUNTIME_IMAGE_TAG)
- .withAppName("worker-one")
- .withNetwork(daprNetwork)
- .withReusablePlacement(reuse)
- .withReusableScheduler(reuse)
- .withComponent(new Component("kvstore", "state.redis", "v1", redisProps))
- .withAppPort(8081)
- .withAppHealthCheckPath("/actuator/health")
- .withAppChannelAddress("host.testcontainers.internal")
- .dependsOn(redisContainer);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/TestWorkerOneApplication.java b/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/TestWorkerOneApplication.java
deleted file mode 100644
index 547cca32fe..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/TestWorkerOneApplication.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workerone;
-
-import io.dapr.springboot4.examples.workerone.WorkerOneApplication;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class TestWorkerOneApplication {
-
- public static void main(String[] args) {
-
- SpringApplication.from(WorkerOneApplication::main)
- .with(DaprTestContainersConfig.class)
- .run(args);
- org.testcontainers.Testcontainers.exposeHostPorts(8081);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/WorkerOneAppIT.java b/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/WorkerOneAppIT.java
deleted file mode 100644
index 6c477e3ae7..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot4/examples/workerone/WorkerOneAppIT.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workerone;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.web.server.LocalServerPort;
-import org.springframework.test.web.servlet.client.RestTestClient;
-
-@SpringBootTest(classes = {TestWorkerOneApplication.class, DaprTestContainersConfig.class},
- webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
-class WorkerOneAppIT {
-
- @LocalServerPort
- private int port;
-
- private RestTestClient client;
-
- @BeforeEach
- void setUp() {
- client = RestTestClient.bindToServer()
- .baseUrl("http://localhost:" + port)
- .build();
- org.testcontainers.Testcontainers.exposeHostPorts(8081);
-
- }
-
- @Test
- void testWorkerOne() {
- //Test the logic of the worker one
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/resources/application.properties b/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/resources/application.properties
deleted file mode 100644
index f1b6b99450..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-one/src/test/resources/application.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-dapr.statestore.name=kvstore
-server.port=8081
\ No newline at end of file
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/pom.xml b/spring-boot-4-examples/workflows/multi-app/worker-two/pom.xml
deleted file mode 100644
index 20a9d6bdaf..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
- 4.0.0
-
-
- io.dapr
- sb4-multi-app
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- sb4-worker-two
- sb4-worker-two
- Spring Boot 4, Testcontainers and Dapr Integration Examples :: Worker 2 App
-
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
- org.springframework.boot
- spring-boot-starter-webmvc
-
-
- org.springframework.boot
- spring-boot-starter-webmvc-test
- test
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter-test
- test
-
-
- com.redis
- testcontainers-redis
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
- worker-two
-
-
-
-
- repackage
-
-
-
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
-
-
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/Customer.java b/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/Customer.java
deleted file mode 100644
index 4b20dbe48e..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/Customer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workertwo;
-
-public class Customer {
- private String customerName;
- private String workflowId;
- private boolean inCustomerDB = false;
- private boolean followUp = false;
-
- public boolean isFollowUp() {
- return followUp;
- }
-
- public void setFollowUp(boolean followUp) {
- this.followUp = followUp;
- }
-
- public boolean isInCustomerDB() {
- return inCustomerDB;
- }
-
- public void setInCustomerDB(boolean inCustomerDB) {
- this.inCustomerDB = inCustomerDB;
- }
-
- public String getWorkflowId() {
- return workflowId;
- }
-
- public void setWorkflowId(String workflowId) {
- this.workflowId = workflowId;
- }
-
- public String getCustomerName() {
- return customerName;
- }
-
- public void setCustomerName(String customerName) {
- this.customerName = customerName;
- }
-
- @Override
- public String toString() {
- return "Customer [customerName=" + customerName + ", workflowId=" + workflowId + ", inCustomerDB="
- + inCustomerDB + ", followUp=" + followUp + "]";
- }
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/CustomerFollowupActivity.java b/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/CustomerFollowupActivity.java
deleted file mode 100644
index 276dda75dc..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/CustomerFollowupActivity.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workertwo;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-@Component
-public class CustomerFollowupActivity implements WorkflowActivity {
-
- private final Logger logger = LoggerFactory.getLogger(CustomerFollowupActivity.class);
-
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Customer customer = ctx.getInput(Customer.class);
- customer.setFollowUp(true);
- logger.info("Customer: {} follow up scheduled.", customer.getCustomerName());
- return customer;
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/WorkerTwoApplication.java b/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/WorkerTwoApplication.java
deleted file mode 100644
index 9a51933292..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/java/io/dapr/springboot4/examples/workertwo/WorkerTwoApplication.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workertwo;
-
-import io.dapr.spring.workflows.config.EnableDaprWorkflows;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-@EnableDaprWorkflows
-public class WorkerTwoApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(WorkerTwoApplication.class, args);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/resources/application.properties b/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/resources/application.properties
deleted file mode 100644
index 7857e2cad1..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/src/main/resources/application.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-spring.application.name=worker-two
-server.port=8082
\ No newline at end of file
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/DaprTestContainersConfig.java b/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/DaprTestContainersConfig.java
deleted file mode 100644
index 59fecf0933..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/DaprTestContainersConfig.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workertwo;
-
-import com.redis.testcontainers.RedisContainer;
-import io.dapr.testcontainers.Component;
-import io.dapr.testcontainers.DaprContainer;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.env.Environment;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.containers.Network;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static io.dapr.testcontainers.DaprContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
-
-@TestConfiguration(proxyBeanMethods = false)
-public class DaprTestContainersConfig {
-
- @Bean
- public Network getDaprNetwork(Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- if (reuse) {
- Network defaultDaprNetwork = new Network() {
- @Override
- public String getId() {
- return "dapr-network";
- }
-
- @Override
- public void close() {
-
- }
- };
-
- List networks = DockerClientFactory.instance().client().listNetworksCmd()
- .withNameFilter("dapr-network").exec();
- if (networks.isEmpty()) {
- Network.builder().createNetworkCmdModifier(cmd -> cmd.withName("dapr-network")).build().getId();
- return defaultDaprNetwork;
- } else {
- return defaultDaprNetwork;
- }
- } else {
- return Network.newNetwork();
- }
- }
-
-
- @Bean
- public RedisContainer redisContainer(Network daprNetwork, Environment env){
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- return new RedisContainer(RedisContainer.DEFAULT_IMAGE_NAME)
- .withNetwork(daprNetwork)
- .withReuse(reuse)
- .withNetworkAliases("redis");
- }
-
- @Bean
- @ServiceConnection
- public DaprContainer daprContainer(Network daprNetwork, RedisContainer redisContainer, Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- Map redisProps = new HashMap<>();
- redisProps.put("redisHost", "redis:6379");
- redisProps.put("redisPassword", "");
- redisProps.put("actorStateStore", String.valueOf(true));
-
- return new DaprContainer(DAPR_RUNTIME_IMAGE_TAG)
- .withAppName("worker-two")
- .withNetwork(daprNetwork)
- .withReusablePlacement(reuse)
- .withReusableScheduler(reuse)
- .withComponent(new Component("kvstore", "state.redis", "v1", redisProps))
- .withAppPort(8082)
- .withAppHealthCheckPath("/actuator/health")
- .withAppChannelAddress("host.testcontainers.internal")
- .dependsOn(redisContainer);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/TestWorkerTwoApplication.java b/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/TestWorkerTwoApplication.java
deleted file mode 100644
index 2be29d1632..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/TestWorkerTwoApplication.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workertwo;
-
-import io.dapr.springboot4.examples.workertwo.WorkerTwoApplication;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class TestWorkerTwoApplication {
-
- public static void main(String[] args) {
-
- SpringApplication.from(WorkerTwoApplication::main)
- .with(DaprTestContainersConfig.class)
- .run(args);
- org.testcontainers.Testcontainers.exposeHostPorts(8082);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/WorkerTwoAppIT.java b/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/WorkerTwoAppIT.java
deleted file mode 100644
index ec5f7deb5f..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot4/examples/workertwo/WorkerTwoAppIT.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.workertwo;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.web.server.LocalServerPort;
-import org.springframework.test.web.servlet.client.RestTestClient;
-
-@SpringBootTest(classes = {TestWorkerTwoApplication.class, DaprTestContainersConfig.class},
- webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
-class WorkerTwoAppIT {
-
- @LocalServerPort
- private int port;
-
- private RestTestClient client;
-
- @BeforeEach
- void setUp() {
- client = RestTestClient.bindToServer()
- .baseUrl("http://localhost:" + port)
- .build();
- org.testcontainers.Testcontainers.exposeHostPorts(8082);
-
- }
-
- @Test
- void testWorkerTwo() {
- //Test the logic of the worker two
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/resources/application.properties b/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/resources/application.properties
deleted file mode 100644
index 2536d68631..0000000000
--- a/spring-boot-4-examples/workflows/multi-app/worker-two/src/test/resources/application.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-dapr.statestore.name=kvstore
-server.port=8082
diff --git a/spring-boot-4-examples/workflows/patterns/README.md b/spring-boot-4-examples/workflows/patterns/README.md
deleted file mode 100644
index 4f6b285dc0..0000000000
--- a/spring-boot-4-examples/workflows/patterns/README.md
+++ /dev/null
@@ -1,512 +0,0 @@
-# Dapr Spring Boot Workflow Examples
-
-This application allows you to run different [workflow patterns](https://docs.dapr.io/developing-applications/building-blocks/workflow/workflow-patterns) including:
-- Chained Activities
-- Parent/Child Workflows
-- Continue workflow by sending External Events
-- Fan Out/In activities for parallel execution
-- Suspend/Resume workflows
-
-## Running these examples from source code
-
-To run these examples you will need:
-- Java SDK
-- Maven
-- Docker or a container runtime such as Podman
-
-From the `spring-boot-examples/workflows` directory you can start the service by running the following command:
-
-
-
-
-```sh
-../../../mvnw spring-boot:test-run
-```
-
-
-
-By running the `spring-boot:test-run` goal, the application is loaded using the [test configurations](src/test/java/io/dapr/springboot4/examples/wfp/DaprTestContainersConfig.java)
-configured using [Testcontainers](https://testcontainers.com) to boostrap the [Dapr](https://dapr.io) sidecar and control plane.
-
-Once the application is running you can trigger the different patterns by sending the following requests:
-
-### Chaining Activities Workflow example
-
-The `io.dapr.springboot.examples.wfp.chain.ChainWorkflow` executes three chained activities. For this example the
-`ToUpperCaseActivity.java` is used to transform to upper case three strings from an array.
-
-```mermaid
-graph LR
- SW((Start
- Workflow))
- A1[Activity1]
- A2[Activity2]
- A3[Activity3]
- EW((End
- Workflow))
- SW --> A1
- A1 --> A2
- A2 --> A3
- A3 --> EW
-```
-
-
-
-
-To start the workflow with the three chained activities you can run:
-
-```sh
-curl -X POST localhost:8080/wfp/chain -H 'Content-Type: application/json' --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-
-As result from executing the request you should see:
-
-```bash
-TOKYO, LONDON, SEATTLE
-```
-
-In the application output you should see the workflow activities being executed.
-
-```bash
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.chain.ChainWorkflow
-i.d.s.e.w.WorkflowPatternsRestController : Workflow instance 7625b4af-8c04-408a-93dc-bad753466e43 started
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Starting Activity: io.dapr.springboot.examples.wfp.chain.ToUpperCaseActivity
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Message Received from input: Tokyo
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Sending message to output: TOKYO
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Starting Activity: io.dapr.springboot.examples.wfp.chain.ToUpperCaseActivity
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Message Received from input: London
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Sending message to output: LONDON
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Starting Activity: io.dapr.springboot.examples.wfp.chain.ToUpperCaseActivity
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Message Received from input: Seattle
-i.d.s.e.wfp.chain.ToUpperCaseActivity : Sending message to output: SEATTLE
-io.dapr.workflows.WorkflowContext : Workflow finished with result: TOKYO, LONDON, SEATTLE
-```
-
-### Parent / Child Workflows example
-
-In this example we start a Parent workflow that calls a child workflow that execute one activity that reverses an input string.
-
-The Parent workflow looks like this:
-
-```mermaid
-graph LR
- SW((Start
- Workflow))
- subgraph for each word in the input
- GWL[Call child workflow]
- end
- EW((End
- Workflow))
- SW --> GWL
- GWL --> EW
-```
-
-The Child workflow looks like this:
-
-```mermaid
-graph LR
- SW((Start
- Workflow))
- A1[Activity1]
- EW((End
- Workflow))
- SW --> A1
- A1 --> EW
-```
-
-To start the parent workflow you can run:
-
-
-
-
-To start the workflow with the three chained activities you can run:
-
-```sh
-curl -X POST localhost:8080/wfp/child -H 'Content-Type: application/json' --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-
-As result from executing the request you should see:
-
-```bash
-!wolfkroW rpaD olleH
-```
-
-In the application output you should see the workflow activities being executed.
-
-```bash
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.child.ParentWorkflow
-io.dapr.workflows.WorkflowContext : calling childworkflow with input: Hello Dapr Workflow!
-i.d.s.e.w.WorkflowPatternsRestController : Workflow instance f3ec9566-a0fc-4d28-8912-3f3ded3cd8a9 started
-io.dapr.workflows.WorkflowContext : Starting ChildWorkflow: io.dapr.springboot.examples.wfp.child.ChildWorkflow
-io.dapr.workflows.WorkflowContext : ChildWorkflow received input: Hello Dapr Workflow!
-io.dapr.workflows.WorkflowContext : ChildWorkflow is calling Activity: io.dapr.springboot.examples.wfp.child.ReverseActivity
-i.d.s.e.wfp.child.ReverseActivity : Starting Activity: io.dapr.springboot.examples.wfp.child.ReverseActivity
-i.d.s.e.wfp.child.ReverseActivity : Message Received from input: Hello Dapr Workflow!
-i.d.s.e.wfp.child.ReverseActivity : Sending message to output: !wolfkroW rpaD olleH
-io.dapr.workflows.WorkflowContext : ChildWorkflow finished with: !wolfkroW rpaD olleH
-io.dapr.workflows.WorkflowContext : childworkflow finished with: !wolfkroW rpaD olleH
-```
-
-### ContinueAsNew Workflows example
-
-In this example we start a workflow that every 3 seconds schedule a new workflow consistently. This workflow executes
-one activity called CleanUpActivity that takes 2 seconds to complete. This loops repeat consistently for 5 times.
-
-To start the workflow you can run:
-
-
-
-
-```sh
-curl -X POST localhost:8080/wfp/continueasnew -H 'Content-Type: application/json' --retry 10 --max-time 60 --retry-all-errors --retry-max-time 90
-```
-
-
-
-As result from executing the request you should see:
-
-```bash
-{"cleanUpTimes":5}
-```
-
-In the application output you should see the workflow activities being executed.
-
-```bash
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.continueasnew.ContinueAsNewWorkflow
-io.dapr.workflows.WorkflowContext : call CleanUpActivity to do the clean up
-i.d.s.e.w.WorkflowPatternsRestController : Workflow instance b808e7d6-ab47-4eba-8188-dc9ff8780764 started
-i.d.s.e.w.continueasnew.CleanUpActivity : Starting Activity: io.dapr.springboot.examples.wfp.continueasnew.CleanUpActivity
-i.d.s.e.w.continueasnew.CleanUpActivity : start clean up work, it may take few seconds to finish... Time:10:48:45
-io.dapr.workflows.WorkflowContext : CleanUpActivity finished
-io.dapr.workflows.WorkflowContext : wait 5 seconds for next clean up
-io.dapr.workflows.WorkflowContext : Let's do more cleaning.
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.continueasnew.ContinueAsNewWorkflow
-io.dapr.workflows.WorkflowContext : call CleanUpActivity to do the clean up
-i.d.s.e.w.continueasnew.CleanUpActivity : Starting Activity: io.dapr.springboot.examples.wfp.continueasnew.CleanUpActivity
-i.d.s.e.w.continueasnew.CleanUpActivity : start clean up work, it may take few seconds to finish... Time:10:48:50
-io.dapr.workflows.WorkflowContext : CleanUpActivity finished
-io.dapr.workflows.WorkflowContext : wait 5 seconds for next clean up
-io.dapr.workflows.WorkflowContext : Let's do more cleaning.
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.continueasnew.ContinueAsNewWorkflow
-io.dapr.workflows.WorkflowContext : call CleanUpActivity to do the clean up
-i.d.s.e.w.continueasnew.CleanUpActivity : Starting Activity: io.dapr.springboot.examples.wfp.continueasnew.CleanUpActivity
-i.d.s.e.w.continueasnew.CleanUpActivity : start clean up work, it may take few seconds to finish... Time:10:48:55
-io.dapr.workflows.WorkflowContext : CleanUpActivity finished
-io.dapr.workflows.WorkflowContext : wait 5 seconds for next clean up
-io.dapr.workflows.WorkflowContext : Let's do more cleaning.
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.continueasnew.ContinueAsNewWorkflow
-io.dapr.workflows.WorkflowContext : call CleanUpActivity to do the clean up
-i.d.s.e.w.continueasnew.CleanUpActivity : Starting Activity: io.dapr.springboot.examples.wfp.continueasnew.CleanUpActivity
-i.d.s.e.w.continueasnew.CleanUpActivity : start clean up work, it may take few seconds to finish... Time:10:49:0
-io.dapr.workflows.WorkflowContext : CleanUpActivity finished
-io.dapr.workflows.WorkflowContext : wait 5 seconds for next clean up
-io.dapr.workflows.WorkflowContext : Let's do more cleaning.
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.continueasnew.ContinueAsNewWorkflow
-io.dapr.workflows.WorkflowContext : call CleanUpActivity to do the clean up
-i.d.s.e.w.continueasnew.CleanUpActivity : Starting Activity: io.dapr.springboot.examples.wfp.continueasnew.CleanUpActivity
-i.d.s.e.w.continueasnew.CleanUpActivity : start clean up work, it may take few seconds to finish... Time:10:49:5
-io.dapr.workflows.WorkflowContext : CleanUpActivity finished
-io.dapr.workflows.WorkflowContext : wait 5 seconds for next clean up
-io.dapr.workflows.WorkflowContext : We did enough cleaning
-```
-
-### External Event Workflow example
-
-In this example we start a workflow that as part of its execution waits for an external event to continue. To correlate
-workflows and events we use the parameter `orderId`
-
-To start the workflow you can run:
-
-
-
-
-```sh
-curl -X POST "localhost:8080/wfp/externalevent?orderId=123" -H 'Content-Type: application/json' --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-
-In the application output you should see the workflow activities being executed.
-
-```bash
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.externalevent.ExternalEventWorkflow
-io.dapr.workflows.WorkflowContext : Waiting for approval...
-i.d.s.e.w.WorkflowPatternsRestController : Workflow instance 8a55cf6d-9059-49b1-8c83-fbe17567a02e started
-```
-
-You should see the Workflow ID that was created, in this example you don't need to remember this id,
-as you can use the orderId to find the right instance.
-When you are ready to approve the order you can send the following request:
-
-
-
-
-To send the event you can run:
-
-```sh
-curl -X POST "localhost:8080/wfp/externalevent-continue?orderId=123&decision=true" -H 'Content-Type: application/json' --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-```bash
-{"approved":true}
-```
-
-In the application output you should see the workflow activities being executed.
-
-```bash
-i.d.s.e.w.WorkflowPatternsRestController : Workflow instance e86bc464-6166-434d-8c91-d99040d6f54e continue
-io.dapr.workflows.WorkflowContext : approval granted - do the approved action
-i.d.s.e.w.externalevent.ApproveActivity : Starting Activity: io.dapr.springboot.examples.wfp.externalevent.ApproveActivity
-i.d.s.e.w.externalevent.ApproveActivity : Running approval activity...
-io.dapr.workflows.WorkflowContext : approval-activity finished
-```
-
-### Fan Out/In Workflow example
-
-In this example we start a workflow that takes an ArrayList of strings and calls one activity per item in the ArrayList. The activities
-are executed and the workflow waits for all of them to complete to aggregate the results.
-
-```mermaid
-graph LR
- SW((Start
- Workflow))
- subgraph for each word in the input
- GWL[GetWordLength]
- end
- ALL[Wait until all tasks
- are completed]
- EW((End
- Workflow))
- SW --> GWL
- GWL --> ALL
- ALL --> EW
-```
-
-To start the workflow you can run:
-
-
-
-
-```sh
-curl -X POST localhost:8080/wfp/fanoutin -H 'Content-Type: application/json' -d @body.json --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-As result from executing the request you should see:
-
-```bash
-{"wordCount":60}
-```
-
-In the application output you should see the workflow activities being executed.
-
-```bash
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.fanoutin.FanOutInWorkflow
-i.d.s.e.w.WorkflowPatternsRestController : Workflow instance a771a7ba-f9fb-4399-aaee-a2fb0b102e5d started
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Starting Activity: io.dapr.springboot.examples.wfp.fanoutin.CountWordsActivity
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Starting Activity: io.dapr.springboot.examples.wfp.fanoutin.CountWordsActivity
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Starting Activity: io.dapr.springboot.examples.wfp.fanoutin.CountWordsActivity
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity returned: 2.
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity finished
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity returned: 11.
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity returned: 17.
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity finished
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity finished
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Starting Activity: io.dapr.springboot.examples.wfp.fanoutin.CountWordsActivity
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity returned: 21.
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity finished
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Starting Activity: io.dapr.springboot.examples.wfp.fanoutin.CountWordsActivity
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity returned: 9.
-i.d.s.e.wfp.fanoutin.CountWordsActivity : Activity finished
-io.dapr.workflows.WorkflowContext : Workflow finished with result: 60
-```
-
-### Suspend/Resume Workflow example
-
-In this example, we start a workflow that executes an activity and then waits for an event. While the workflow instance
-is waiting for the event, we execute a suspend workflow operation. Once we check the state of the instance, a resume
-operation is executed.
-
-To start the workflow, you can run:
-
-
-
-
-```sh
-curl -X POST "localhost:8080/wfp/suspendresume?orderId=456" -H 'Content-Type: application/json' --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-In the application output you should see the workflow activities being executed.
-
-```bash
-io.dapr.workflows.WorkflowContext : Starting Workflow: io.dapr.springboot.examples.wfp.suspendresume.SuspendResumeWorkflow
-i.d.s.e.w.WorkflowPatternsRestController : Workflow instance 2de2b968-900a-4f5b-9092-b26aefbfc6b3 started
-i.d.s.e.w.s.PerformTaskActivity : Starting Activity: io.dapr.springboot.examples.wfp.suspendresume.PerformTaskActivity
-i.d.s.e.w.s.PerformTaskActivity : Running activity...
-i.d.s.e.w.s.PerformTaskActivity : Completing activity...
-io.dapr.workflows.WorkflowContext : Waiting for approval...
-
-```
-
-You should see the Workflow ID that was created, in this example you don't need to remember this id,
-as you can use the orderId to find the right instance.
-
-
-
-
-
-Let's suspend the workflow instance by sending the following request:
-
-```sh
-curl -X POST "localhost:8080/wfp/suspendresume/suspend?orderId=456" -H 'Content-Type: application/json' --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-
-You should see the output of the requests:
-
-```sh
-SUSPENDED
-```
-
-Now, let's resume the workflow instance:
-
-
-
-
-To send the event you can run:
-
-```sh
-curl -X POST "localhost:8080/wfp/suspendresume/resume?orderId=456" -H 'Content-Type: application/json' --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-You should see the output of the requests:
-
-```sh
-RUNNING
-```
-
-Now, let's send the event that the instance is waiting to validate that the workflow complete after
-being suspended and resumed.
-
-
-
-
-To send the event you can run:
-
-```sh
-curl -X POST "localhost:8080/wfp/suspendresume/continue?orderId=456&decision=true" -H 'Content-Type: application/json' --retry 10 --max-time 20 --retry-all-errors --retry-max-time 90
-```
-
-
-
-The output of the request contains the output of the workflow based on the `decision` parameter that we sent.
-
-```bash
-{"approved":true}
-```
-
-In the application output you should see, that the workflow instance completed correctly:
-
-```sh
-i.d.s.e.w.WorkflowPatternsRestController : Workflow instance 2de2b968-900a-4f5b-9092-b26aefbfc6b3 continue
-io.dapr.workflows.WorkflowContext : approval-event arrived
-i.d.s.e.w.s.PerformTaskActivity : Starting Activity: io.dapr.springboot.examples.wfp.suspendresume.PerformTaskActivity
-i.d.s.e.w.s.PerformTaskActivity : Running activity...
-i.d.s.e.w.s.PerformTaskActivity : Completing activity...
-```
-
-## Testing workflow executions
-
-Workflow execution can be tested using Testcontainers and you can find all the tests for the patterns covered in this
-application [here](src/test/java/io/dapr/springboot4/examples/wfp/TestWorkflowPatternsApplication.java).
diff --git a/spring-boot-4-examples/workflows/patterns/body.json b/spring-boot-4-examples/workflows/patterns/body.json
deleted file mode 100644
index 5c91cea787..0000000000
--- a/spring-boot-4-examples/workflows/patterns/body.json
+++ /dev/null
@@ -1,5 +0,0 @@
-["Hello, world!",
- "The quick brown fox jumps over the lazy dog.",
- "If a tree falls in the forest and there is no one there to hear it, does it make a sound?",
- "The greatest glory in living lies not in never falling, but in rising every time we fall.",
- "Always remember that you are absolutely unique. Just like everyone else."]
diff --git a/spring-boot-4-examples/workflows/patterns/pom.xml b/spring-boot-4-examples/workflows/patterns/pom.xml
deleted file mode 100644
index a6855df160..0000000000
--- a/spring-boot-4-examples/workflows/patterns/pom.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
- 4.0.0
-
-
- io.dapr
- sb4-workflows
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- sb4-patterns
- sb4-patterns
- Spring Boot 4, Testcontainers and Dapr Integration Examples :: Workflows Patterns
-
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
- org.springframework.boot
- spring-boot-starter-webmvc
-
-
- org.springframework.boot
- spring-boot-starter-restclient
-
-
- org.springframework.boot
- spring-boot-starter-webmvc-test
- test
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter
-
-
- io.dapr.spring
- dapr-spring-boot-4-starter-test
- test
-
-
- io.github.microcks
- microcks-testcontainers
- test
-
-
- org.testcontainers
- testcontainers-postgresql
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
-
-
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsApplication.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsApplication.java
deleted file mode 100644
index 6673891f4c..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsApplication.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class WorkflowPatternsApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(WorkflowPatternsApplication.class, args);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsConfiguration.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsConfiguration.java
deleted file mode 100644
index c173208513..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsConfiguration.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import io.dapr.springboot4.examples.wfp.continueasnew.CleanUpLog;
-import org.springframework.boot.restclient.RestTemplateBuilder;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.client.RestTemplate;
-
-@Configuration
-public class WorkflowPatternsConfiguration {
- @Bean
- public CleanUpLog cleanUpLog(){
- return new CleanUpLog();
- }
-
- @Bean
- public RestTemplate restTemplate() {
- return new RestTemplateBuilder().build();
- }
-
- @Bean
- public ObjectMapper mapper() {
- return new ObjectMapper();
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsRestController.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsRestController.java
deleted file mode 100644
index 46bb3d665f..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsRestController.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp;
-
-import io.dapr.spring.workflows.config.EnableDaprWorkflows;
-import io.dapr.springboot4.examples.wfp.chain.ChainWorkflow;
-import io.dapr.springboot4.examples.wfp.child.ParentWorkflow;
-import io.dapr.springboot4.examples.wfp.continueasnew.CleanUpLog;
-import io.dapr.springboot4.examples.wfp.continueasnew.ContinueAsNewWorkflow;
-import io.dapr.springboot4.examples.wfp.externalevent.Decision;
-import io.dapr.springboot4.examples.wfp.externalevent.ExternalEventWorkflow;
-import io.dapr.springboot4.examples.wfp.fanoutin.FanOutInWorkflow;
-import io.dapr.springboot4.examples.wfp.fanoutin.Result;
-import io.dapr.springboot4.examples.wfp.remoteendpoint.Payload;
-import io.dapr.springboot4.examples.wfp.remoteendpoint.RemoteEndpointWorkflow;
-import io.dapr.springboot4.examples.wfp.timer.DurationTimerWorkflow;
-import io.dapr.springboot4.examples.wfp.timer.ZonedDateTimeTimerWorkflow;
-import io.dapr.workflows.client.DaprWorkflowClient;
-import io.dapr.workflows.client.WorkflowState;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeoutException;
-
-@RestController
-@EnableDaprWorkflows
-public class WorkflowPatternsRestController {
-
- private final Logger logger = LoggerFactory.getLogger(WorkflowPatternsRestController.class);
-
- @Autowired
- private DaprWorkflowClient daprWorkflowClient;
-
- @Autowired
- private CleanUpLog cleanUpLog;
-
- private Map ordersToApprove = new HashMap<>();
-
-
-
- /**
- * Run Chain Demo Workflow
- * @return the output of the ChainWorkflow execution
- */
- @PostMapping("wfp/chain")
- public String chain() throws TimeoutException {
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(ChainWorkflow.class);
- logger.info("Workflow instance " + instanceId + " started");
- return daprWorkflowClient
- .waitForWorkflowCompletion(instanceId, Duration.ofSeconds(10), true)
- .readOutputAs(String.class);
- }
-
-
- /**
- * Run Child Demo Workflow
- * @return confirmation that the workflow instance was created for the workflow pattern child
- */
- @PostMapping("wfp/child")
- public String child() throws TimeoutException {
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(ParentWorkflow.class);
- logger.info("Workflow instance " + instanceId + " started");
- return daprWorkflowClient
- .waitForWorkflowCompletion(instanceId, Duration.ofSeconds(10), true)
- .readOutputAs(String.class);
- }
-
-
- /**
- * Run Fan Out/in Demo Workflow
- * @return confirmation that the workflow instance was created for the workflow pattern faninout
- */
- @PostMapping("wfp/fanoutin")
- public Result fanOutIn(@RequestBody List listOfStrings) throws TimeoutException {
-
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(FanOutInWorkflow.class, listOfStrings);
- logger.info("Workflow instance " + instanceId + " started");
-
- // Block until the orchestration completes. Then print the final status, which includes the output.
- WorkflowState workflowState = daprWorkflowClient.waitForWorkflowCompletion(
- instanceId,
- Duration.ofSeconds(30),
- true);
- logger.info("workflow instance with ID: %s completed with result: %s%n", instanceId,
- workflowState.readOutputAs(Result.class));
- return workflowState.readOutputAs(Result.class);
- }
-
- /**
- * Run External Event Workflow Pattern
- * @return confirmation that the workflow instance was created for the workflow pattern externalevent
- */
- @PostMapping("wfp/externalevent")
- public String externalEvent(@RequestParam("orderId") String orderId) {
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(ExternalEventWorkflow.class);
- ordersToApprove.put(orderId, instanceId);
- logger.info("Workflow instance " + instanceId + " started");
- return instanceId;
- }
-
- @PostMapping("wfp/externalevent-continue")
- public Decision externalEventContinue(@RequestParam("orderId") String orderId, @RequestParam("decision") Boolean decision)
- throws TimeoutException {
- String instanceId = ordersToApprove.get(orderId);
- logger.info("Workflow instance " + instanceId + " continue");
- daprWorkflowClient.raiseEvent(instanceId, "Approval", decision);
- WorkflowState workflowInstanceStatus = daprWorkflowClient
- .waitForWorkflowCompletion(instanceId, null, true);
- return workflowInstanceStatus.readOutputAs(Decision.class);
- }
-
- @PostMapping("wfp/continueasnew")
- public CleanUpLog continueAsNew()
- throws TimeoutException {
-
- cleanUpLog.clearLog();
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(ContinueAsNewWorkflow.class);
- logger.info("Workflow instance " + instanceId + " started");
-
- WorkflowState workflowInstanceStatus = daprWorkflowClient.waitForWorkflowCompletion(instanceId, null, true);
- System.out.printf("workflow instance with ID: %s completed.", instanceId);
- return workflowInstanceStatus.readOutputAs(CleanUpLog.class);
- }
-
- @PostMapping("wfp/remote-endpoint")
- public Payload remoteEndpoint(@RequestBody Payload payload)
- throws TimeoutException {
-
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(RemoteEndpointWorkflow.class, payload);
- logger.info("Workflow instance " + instanceId + " started");
-
- WorkflowState workflowInstanceStatus = daprWorkflowClient
- .waitForWorkflowCompletion(instanceId, null, true);
- System.out.printf("workflow instance with ID: %s completed.", instanceId);
- return workflowInstanceStatus.readOutputAs(Payload.class);
- }
-
- @PostMapping("wfp/suspendresume")
- public String suspendResume(@RequestParam("orderId") String orderId) {
- String instanceId = daprWorkflowClient.scheduleNewWorkflow(ExternalEventWorkflow.class);
- logger.info("Workflow instance " + instanceId + " started");
- ordersToApprove.put(orderId, instanceId);
- return instanceId;
- }
-
- @PostMapping("wfp/suspendresume/suspend")
- public String suspendResumeExecuteSuspend(@RequestParam("orderId") String orderId) {
- String instanceId = ordersToApprove.get(orderId);
- daprWorkflowClient.suspendWorkflow(instanceId, "testing suspend");
- WorkflowState instanceState = daprWorkflowClient.getWorkflowState(instanceId, false);
- return instanceState.getRuntimeStatus().name();
- }
-
- @PostMapping("wfp/suspendresume/resume")
- public String suspendResumeExecuteResume(@RequestParam("orderId") String orderId) {
- String instanceId = ordersToApprove.get(orderId);
- daprWorkflowClient.resumeWorkflow(instanceId, "testing resume");
- WorkflowState instanceState = daprWorkflowClient.getWorkflowState(instanceId, false);
- return instanceState.getRuntimeStatus().name();
- }
-
-
- @PostMapping("wfp/suspendresume/continue")
- public Decision suspendResumeContinue(@RequestParam("orderId") String orderId, @RequestParam("decision") Boolean decision)
- throws TimeoutException {
- String instanceId = ordersToApprove.get(orderId);
- logger.info("Workflow instance " + instanceId + " continue");
- daprWorkflowClient.raiseEvent(instanceId, "Approval", decision);
- WorkflowState workflowInstanceStatus = daprWorkflowClient
- .waitForWorkflowCompletion(instanceId, null, true);
- return workflowInstanceStatus.readOutputAs(Decision.class);
- }
-
- @PostMapping("wfp/durationtimer")
- public String durationTimerWorkflow() {
- return daprWorkflowClient.scheduleNewWorkflow(DurationTimerWorkflow.class);
- }
-
- @PostMapping("wfp/zoneddatetimetimer")
- public String zonedDateTimeTimerWorkflow() {
- return daprWorkflowClient.scheduleNewWorkflow(ZonedDateTimeTimerWorkflow.class);
- }
-
-}
-
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/chain/ChainWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/chain/ChainWorkflow.java
deleted file mode 100644
index 325b28dd26..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/chain/ChainWorkflow.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.chain;
-
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ChainWorkflow implements Workflow {
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting Workflow: " + ctx.getName());
-
- String result = "";
- result += ctx.callActivity(ToUpperCaseActivity.class.getName(), "Tokyo", String.class).await() + ", ";
- result += ctx.callActivity(ToUpperCaseActivity.class.getName(), "London", String.class).await() + ", ";
- result += ctx.callActivity(ToUpperCaseActivity.class.getName(), "Seattle", String.class).await();
-
- ctx.getLogger().info("Workflow finished with result: " + result);
- ctx.complete(result);
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/chain/ToUpperCaseActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/chain/ToUpperCaseActivity.java
deleted file mode 100644
index e5c92d8d22..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/chain/ToUpperCaseActivity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.chain;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ToUpperCaseActivity implements WorkflowActivity {
-
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Logger logger = LoggerFactory.getLogger(ToUpperCaseActivity.class);
- logger.info("Starting Activity: " + ctx.getName());
-
- var message = ctx.getInput(String.class);
- var newMessage = message.toUpperCase();
-
- logger.info("Message Received from input: " + message);
- logger.info("Sending message to output: " + newMessage);
-
- return newMessage;
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ChildWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ChildWorkflow.java
deleted file mode 100644
index bac7d0ac3a..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ChildWorkflow.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.child;
-
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ChildWorkflow implements Workflow {
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting ChildWorkflow: " + ctx.getName());
-
- var childWorkflowInput = ctx.getInput(String.class);
- ctx.getLogger().info("ChildWorkflow received input: " + childWorkflowInput);
-
- ctx.getLogger().info("ChildWorkflow is calling Activity: " + ReverseActivity.class.getName());
- String result = ctx.callActivity(ReverseActivity.class.getName(), childWorkflowInput, String.class).await();
-
- ctx.getLogger().info("ChildWorkflow finished with: " + result);
- ctx.complete(result);
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ParentWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ParentWorkflow.java
deleted file mode 100644
index 4e3506b3eb..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ParentWorkflow.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.child;
-
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ParentWorkflow implements Workflow {
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting Workflow: " + ctx.getName());
-
- var childWorkflowInput = "Hello Dapr Workflow!";
- ctx.getLogger().info("calling childworkflow with input: " + childWorkflowInput);
-
- var childWorkflowOutput =
- ctx.callChildWorkflow(ChildWorkflow.class.getName(), childWorkflowInput, String.class).await();
-
- ctx.getLogger().info("childworkflow finished with: " + childWorkflowOutput);
- ctx.complete(childWorkflowOutput);
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ReverseActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ReverseActivity.java
deleted file mode 100644
index f9b8c9105e..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/child/ReverseActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.child;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ReverseActivity implements WorkflowActivity {
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Logger logger = LoggerFactory.getLogger(ReverseActivity.class);
- logger.info("Starting Activity: " + ctx.getName());
-
- var message = ctx.getInput(String.class);
- var newMessage = new StringBuilder(message).reverse().toString();
-
- logger.info("Message Received from input: " + message);
- logger.info("Sending message to output: " + newMessage);
-
- return newMessage;
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/CleanUpActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/CleanUpActivity.java
deleted file mode 100644
index 00458dae80..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/CleanUpActivity.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.continueasnew;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-import java.util.concurrent.TimeUnit;
-
-@Component
-public class CleanUpActivity implements WorkflowActivity {
-
- @Autowired
- private CleanUpLog cleanUpLog;
-
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Logger logger = LoggerFactory.getLogger(CleanUpActivity.class);
- logger.info("Starting Activity: " + ctx.getName());
-
- LocalDateTime now = LocalDateTime.now();
- String cleanUpTimeString = now.getHour() + ":" + now.getMinute() + ":" + now.getSecond();
- logger.info("start clean up work, it may take few seconds to finish... Time:" + cleanUpTimeString);
-
- //Sleeping for 2 seconds to simulate long running operation
- try {
- TimeUnit.SECONDS.sleep(2);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
-
- cleanUpLog.increment();
-
- return "clean up finish.";
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/CleanUpLog.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/CleanUpLog.java
deleted file mode 100644
index e5f3909fc6..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/CleanUpLog.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.continueasnew;
-
-public class CleanUpLog {
- private Integer cleanUpTimes = 0;
-
- public CleanUpLog() {
- }
-
- public void increment() {
- this.cleanUpTimes += 1;
- }
-
- public Integer getCleanUpTimes() {
- return cleanUpTimes;
- }
-
- public void clearLog(){
- this.cleanUpTimes = 0;
- }
-}
-
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/ContinueAsNewWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/ContinueAsNewWorkflow.java
deleted file mode 100644
index cc8eb4e0e7..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/continueasnew/ContinueAsNewWorkflow.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.continueasnew;
-
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.time.Duration;
-
-@Component
-public class ContinueAsNewWorkflow implements Workflow {
- /*
- Compared with a CRON schedule, this periodic workflow example will never overlap.
- For example, a CRON schedule that executes a cleanup every hour will execute it at 1:00, 2:00, 3:00 etc.
- and could potentially run into overlap issues if the cleanup takes longer than an hour.
- In this example, however, if the cleanup takes 30 minutes, and we create a timer for 1 hour between cleanups,
- then it will be scheduled at 1:00, 2:30, 4:00, etc. and there is no chance of overlap.
- */
-
- @Autowired
- private CleanUpLog cleanUpLog;
-
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting Workflow: " + ctx.getName());
-
- ctx.getLogger().info("call CleanUpActivity to do the clean up");
- ctx.callActivity(CleanUpActivity.class.getName(), cleanUpLog).await();
- ctx.getLogger().info("CleanUpActivity finished");
-
- ctx.getLogger().info("wait 5 seconds for next clean up");
- ctx.createTimer(Duration.ofSeconds(3)).await();
-
- if(cleanUpLog.getCleanUpTimes() < 5) {
- // continue the workflow.
- ctx.getLogger().info("Let's do more cleaning.");
- ctx.continueAsNew(null);
- } else{
- ctx.getLogger().info("We did enough cleaning");
- ctx.complete(cleanUpLog);
- }
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/ApproveActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/ApproveActivity.java
deleted file mode 100644
index 63520f5a05..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/ApproveActivity.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.externalevent;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.TimeUnit;
-
-@Component
-public class ApproveActivity implements WorkflowActivity {
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Logger logger = LoggerFactory.getLogger(ApproveActivity.class);
- logger.info("Starting Activity: " + ctx.getName());
-
- logger.info("Running approval activity...");
- //Sleeping for 5 seconds to simulate long running operation
- try {
- TimeUnit.SECONDS.sleep(5);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
-
- return new Decision(true);
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/Decision.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/Decision.java
deleted file mode 100644
index be3ca2ee06..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/Decision.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.externalevent;
-
-public class Decision {
- private Boolean approved;
-
- public Decision() {
- }
-
- public Decision(Boolean approved) {
- this.approved = approved;
- }
-
- public Boolean getApproved() {
- return approved;
- }
-
- public void setApproved(Boolean approved) {
- this.approved = approved;
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/DenyActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/DenyActivity.java
deleted file mode 100644
index 40eb744df8..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/DenyActivity.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.externalevent;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.TimeUnit;
-
-@Component
-public class DenyActivity implements WorkflowActivity {
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Logger logger = LoggerFactory.getLogger(DenyActivity.class);
- logger.info("Starting Activity: " + ctx.getName());
-
- logger.info("Running denied activity...");
- //Sleeping for 5 seconds to simulate long running operation
- try {
- TimeUnit.SECONDS.sleep(5);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
-
- return new Decision(false);
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/ExternalEventWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/ExternalEventWorkflow.java
deleted file mode 100644
index ba30d216e8..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/externalevent/ExternalEventWorkflow.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.externalevent;
-
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ExternalEventWorkflow implements Workflow {
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting Workflow: " + ctx.getName());
-
- ctx.getLogger().info("Waiting for approval...");
- Boolean approved = ctx.waitForExternalEvent("Approval", boolean.class).await();
- Decision decision = null;
- if (approved) {
- ctx.getLogger().info("approval granted - do the approved action");
- decision = ctx.callActivity(ApproveActivity.class.getName(), Decision.class).await();
-
- ctx.getLogger().info("approval-activity finished");
- } else {
- ctx.getLogger().info("approval denied - send a notification");
- decision = ctx.callActivity(DenyActivity.class.getName(), Decision.class).await();
- ctx.getLogger().info("denied-activity finished");
- }
- ctx.complete(decision);
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/CountWordsActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/CountWordsActivity.java
deleted file mode 100644
index 62dcd266a4..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/CountWordsActivity.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.fanoutin;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import java.util.StringTokenizer;
-
-@Component
-public class CountWordsActivity implements WorkflowActivity {
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Logger logger = LoggerFactory.getLogger(CountWordsActivity.class);
- logger.info("Starting Activity: {}", ctx.getName());
-
- String input = ctx.getInput(String.class);
- StringTokenizer tokenizer = new StringTokenizer(input);
- int result = tokenizer.countTokens();
-
- logger.info("Activity returned: {}.", result);
- logger.info("Activity finished");
-
- return result;
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/FanOutInWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/FanOutInWorkflow.java
deleted file mode 100644
index f41745ae07..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/FanOutInWorkflow.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.fanoutin;
-
-import io.dapr.durabletask.Task;
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-@Component
-public class FanOutInWorkflow implements Workflow {
- @Override
- public WorkflowStub create() {
- return ctx -> {
-
- ctx.getLogger().info("Starting Workflow: " + ctx.getName());
-
-
- // The input is a list of objects that need to be operated on.
- // In this example, inputs are expected to be strings.
- List> inputs = ctx.getInput(List.class);
-
- // Fan-out to multiple concurrent activity invocations, each of which does a word count.
- List> tasks = inputs.stream()
- .map(input -> ctx.callActivity(CountWordsActivity.class.getName(), input.toString(), Integer.class))
- .collect(Collectors.toList());
-
- // Fan-in to get the total word count from all the individual activity results.
- List allWordCountResults = ctx.allOf(tasks).await();
- int totalWordCount = allWordCountResults.stream().mapToInt(Integer::intValue).sum();
-
- ctx.getLogger().info("Workflow finished with result: " + totalWordCount);
- // Save the final result as the orchestration output.
- ctx.complete(new Result(totalWordCount));
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/Result.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/Result.java
deleted file mode 100644
index 5cfeac57c8..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/fanoutin/Result.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.fanoutin;
-
-public class Result {
- private Integer wordCount;
-
- public Result() {
- }
-
- public Result(Integer wordCount) {
- this.wordCount = wordCount;
- }
-
- public Integer getWordCount() {
- return wordCount;
- }
-
- public void setWordCount(Integer wordCount) {
- this.wordCount = wordCount;
- }
-};
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/CallRemoteEndpointActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/CallRemoteEndpointActivity.java
deleted file mode 100644
index 433eba1c4f..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/CallRemoteEndpointActivity.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.remoteendpoint;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpEntity;
-import org.springframework.stereotype.Component;
-import org.springframework.web.client.RestTemplate;
-
-@Component
-public class CallRemoteEndpointActivity implements WorkflowActivity {
-
- private Logger logger = LoggerFactory.getLogger(CallRemoteEndpointActivity.class);
-
- @Value("${application.process-base-url:}")
- private String processBaseURL;
-
- @Autowired
- private RestTemplate restTemplate;
-
-
- @Override
- public Object run(WorkflowActivityContext ctx) {
- logger.info("Starting Activity: " + ctx.getName());
- var payload = ctx.getInput(Payload.class);
-
- HttpEntity request =
- new HttpEntity<>(payload);
- payload = restTemplate.postForObject(processBaseURL + "/process", request, Payload.class);
-
- logger.info("Payload from the remote service: " + payload);
-
- return payload;
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/Payload.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/Payload.java
deleted file mode 100644
index 45dcde9171..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/Payload.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.remoteendpoint;
-
-public class Payload {
- private String id;
- private String content;
- private Boolean processed = false;
-
- public Payload(String id, String content) {
- this.id = id;
- this.content = content;
- }
-
- public Payload() {
- }
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
-
- public String getContent() {
- return content;
- }
-
- public void setContent(String content) {
- this.content = content;
- }
-
- public Boolean getProcessed() {
- return processed;
- }
-
- public void setProcessed(Boolean processed) {
- this.processed = processed;
- }
-
- @Override
- public String toString() {
- return "Payload{" +
- "id='" + id + '\'' +
- ", content='" + content + '\'' +
- ", processed=" + processed +
- '}';
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/RemoteEndpointWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/RemoteEndpointWorkflow.java
deleted file mode 100644
index 30754c43f9..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/remoteendpoint/RemoteEndpointWorkflow.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2023 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.remoteendpoint;
-
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import io.dapr.workflows.WorkflowTaskOptions;
-import io.dapr.workflows.WorkflowTaskRetryPolicy;
-import org.springframework.stereotype.Component;
-
-import java.time.Duration;
-
-@Component
-public class RemoteEndpointWorkflow implements Workflow {
-
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting Workflow: " + ctx.getName());
-
- Payload payload = ctx.getInput(Payload.class);
- payload = ctx.callActivity(CallRemoteEndpointActivity.class.getName(), payload ,
- new WorkflowTaskOptions(new WorkflowTaskRetryPolicy(5,
- Duration.ofSeconds(2), 1.0, Duration.ofSeconds(10), Duration.ofSeconds(20))),
- Payload.class).await();
-
- ctx.getLogger().info("Workflow finished with result: " + payload);
- ctx.complete(payload);
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/suspendresume/PerformTaskActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/suspendresume/PerformTaskActivity.java
deleted file mode 100644
index 928559adf2..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/suspendresume/PerformTaskActivity.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.suspendresume;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.TimeUnit;
-
-@Component
-public class PerformTaskActivity implements WorkflowActivity {
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Logger logger = LoggerFactory.getLogger(PerformTaskActivity.class);
- logger.info("Starting Activity: " + ctx.getName());
-
- logger.info("Running activity...");
- //Sleeping for 5 seconds to simulate long running operation
- try {
- TimeUnit.SECONDS.sleep(5);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
-
- logger.info("Completing activity...");
-
- return "OK";
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/suspendresume/SuspendResumeWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/suspendresume/SuspendResumeWorkflow.java
deleted file mode 100644
index d62772cd65..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/suspendresume/SuspendResumeWorkflow.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.suspendresume;
-
-import io.dapr.springboot4.examples.wfp.externalevent.Decision;
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-@Component
-public class SuspendResumeWorkflow implements Workflow {
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting Workflow: " + ctx.getName());
-
- ctx.callActivity(PerformTaskActivity.class.getName(), String.class).await();
-
- ctx.getLogger().info("Waiting for approval...");
- Boolean approved = ctx.waitForExternalEvent("Approval", boolean.class).await();
-
- ctx.getLogger().info("approval-event arrived");
-
- ctx.callActivity(PerformTaskActivity.class.getName(), String.class).await();
-
- ctx.complete(new Decision(approved));
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/DurationTimerWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/DurationTimerWorkflow.java
deleted file mode 100644
index 85d218d89e..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/DurationTimerWorkflow.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.timer;
-
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-import java.time.Duration;
-import java.util.Date;
-
-@Component
-public class DurationTimerWorkflow implements Workflow {
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting Workflow: {}, instanceId: {}", ctx.getName(), ctx.getInstanceId());
-
- ctx.getLogger().info("Let's call the first LogActivity at {}", new Date());
- ctx.callActivity(LogActivity.class.getName()).await();
-
- ctx.getLogger().info("Let's schedule a 10 seconds timer at {}", new Date());
- ctx.createTimer(Duration.ofSeconds(10)).await();
-
- ctx.getLogger().info("Let's call the second LogActivity at {}", new Date());
- ctx.callActivity(LogActivity.class.getName()).await();
-
- ctx.complete(true);
- ctx.getLogger().info("Workflow completed at {}", new Date());
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/LogActivity.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/LogActivity.java
deleted file mode 100644
index acaf4515b2..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/LogActivity.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.timer;
-
-import io.dapr.workflows.WorkflowActivity;
-import io.dapr.workflows.WorkflowActivityContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-
-@Component
-public class LogActivity implements WorkflowActivity {
-
- @Autowired
- private TimerLogService logService;
-
- @Override
- public Object run(WorkflowActivityContext ctx) {
- Logger logger = LoggerFactory.getLogger(LogActivity.class);
- Date now = new Date();
- logger.info("Running Activity: {} at {}", ctx.getName(), now);
- logService.logDate(now);
- return true;
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/TimerLogService.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/TimerLogService.java
deleted file mode 100644
index f368389b95..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/TimerLogService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-package io.dapr.springboot4.examples.wfp.timer;
-
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-@Component
-public class TimerLogService {
- private final List logDates = new ArrayList<>();
-
- public void logDate(Date date){
- logDates.add(date);
- }
-
- public void clearLog(){
- logDates.clear();
- }
-
- public List getLogDates(){
- return logDates;
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/ZonedDateTimeTimerWorkflow.java b/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/ZonedDateTimeTimerWorkflow.java
deleted file mode 100644
index 4491667450..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/java/io/dapr/springboot4/examples/wfp/timer/ZonedDateTimeTimerWorkflow.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp.timer;
-
-import io.dapr.workflows.Workflow;
-import io.dapr.workflows.WorkflowStub;
-import org.springframework.stereotype.Component;
-
-import java.time.ZonedDateTime;
-import java.util.Date;
-
-@Component
-public class ZonedDateTimeTimerWorkflow implements Workflow {
- @Override
- public WorkflowStub create() {
- return ctx -> {
- ctx.getLogger().info("Starting Workflow: {}, instanceId: {}", ctx.getName(), ctx.getInstanceId());
-
- ctx.getLogger().info("Let's call the first LogActivity at {}", new Date());
- ctx.callActivity(LogActivity.class.getName()).await();
-
- ZonedDateTime now = ZonedDateTime.now();
- //Let's create a ZonedDateTime 10 seconds in the future
- ZonedDateTime inTheFuture = now.plusSeconds(10);
- ctx.getLogger().info("Creating a timer that due {} at: {}", inTheFuture, new Date());
- ctx.createTimer(inTheFuture).await();
- ctx.getLogger().info("The timer fired at: {}", new Date());
-
- ctx.getLogger().info("Let's call the second LogActivity at {}", new Date());
- ctx.callActivity(LogActivity.class.getName()).await();
-
- ctx.complete(true);
- ctx.getLogger().info("Workflow completed at {}", new Date());
- };
- }
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/main/resources/application.properties b/spring-boot-4-examples/workflows/patterns/src/main/resources/application.properties
deleted file mode 100644
index 7fd4ccd5b9..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-spring.application.name=workflow-patterns-app
diff --git a/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/DaprTestContainersConfig.java b/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/DaprTestContainersConfig.java
deleted file mode 100644
index 1dbd1c0ed4..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/DaprTestContainersConfig.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp;
-
-
-import io.dapr.testcontainers.Component;
-import io.dapr.testcontainers.DaprContainer;
-import io.dapr.testcontainers.WorkflowDashboardContainer;
-import io.github.microcks.testcontainers.MicrocksContainersEnsemble;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.env.Environment;
-import org.springframework.test.context.DynamicPropertyRegistrar;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.containers.Network;
-import org.testcontainers.postgresql.PostgreSQLContainer;
-import org.testcontainers.utility.DockerImageName;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static io.dapr.testcontainers.DaprContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
-
-/**
- * Test configuration for Dapr containers with debug logging enabled.
- *
- * This configuration sets up Dapr with DEBUG log level and console output
- * for detailed logging during test execution.
- *
- * ADDITIONAL DEBUGGING: For even more detailed logs, you can also:
- * 1. Run `docker ps` to find the Dapr container ID
- * 2. Run `docker logs --follow ` to stream real-time logs
- */
-@TestConfiguration(proxyBeanMethods = false)
-public class DaprTestContainersConfig {
-
- Map postgreSQLDetails = new HashMap<>();
-
- {{
- postgreSQLDetails.put("host", "postgresql");
- postgreSQLDetails.put("user", "postgres");
- postgreSQLDetails.put("password", "postgres");
- postgreSQLDetails.put("database", "dapr");
- postgreSQLDetails.put("port", "5432");
- postgreSQLDetails.put("actorStateStore", String.valueOf(true));
-
- }}
-
- private Component stateStoreComponent = new Component("kvstore",
- "state.postgresql", "v2", postgreSQLDetails);
-
- @Bean
- @ServiceConnection
- public DaprContainer daprContainer(Network network, PostgreSQLContainer postgreSQLContainer) {
-
- return new DaprContainer(DAPR_RUNTIME_IMAGE_TAG)
- .withAppName("workflow-patterns-app")
- .withComponent(stateStoreComponent)
- .withAppPort(8080)
- .withNetwork(network)
- .withAppHealthCheckPath("/actuator/health")
- .withAppChannelAddress("host.testcontainers.internal")
- .dependsOn(postgreSQLContainer);
- }
-
- @Bean
- public PostgreSQLContainer postgreSQLContainer(Network network) {
- return new PostgreSQLContainer(DockerImageName.parse("postgres"))
- .withNetworkAliases("postgresql")
- .withDatabaseName("dapr")
- .withUsername("postgres")
- .withPassword("postgres")
- .withNetwork(network);
- }
-
- @Bean
- MicrocksContainersEnsemble microcksEnsemble(Network network) {
- return new MicrocksContainersEnsemble(network, "quay.io/microcks/microcks-uber:1.11.2")
- .withAccessToHost(true) // We need this to access our webapp while it runs
- .withMainArtifacts("third-parties/remote-http-service.yaml");
- }
-
- @Bean
- public WorkflowDashboardContainer workflowDashboard(Network network) {
- return new WorkflowDashboardContainer(WorkflowDashboardContainer.getDefaultImageName())
- .withNetwork(network)
- .withStateStoreComponent(stateStoreComponent)
- .withExposedPorts(8080);
- }
-
- @Bean
- public DynamicPropertyRegistrar endpointsProperties(MicrocksContainersEnsemble ensemble) {
- // We need to replace the default endpoints with those provided by Microcks.
- return (properties) -> {
- properties.add("application.process-base-url", () -> ensemble.getMicrocksContainer()
- .getRestMockEndpoint("API Payload Processor", "1.0.0"));
- };
- }
-
- @Bean
- public Network getDaprNetwork(Environment env) {
- boolean reuse = env.getProperty("reuse", Boolean.class, false);
- if (reuse) {
- Network defaultDaprNetwork = new Network() {
- @Override
- public String getId() {
- return "dapr-network";
- }
-
- @Override
- public void close() {
-
- }
- };
-
- List networks = DockerClientFactory.instance().client().listNetworksCmd()
- .withNameFilter("dapr-network").exec();
- if (networks.isEmpty()) {
- Network.builder().createNetworkCmdModifier(cmd -> cmd.withName("dapr-network")).build().getId();
- return defaultDaprNetwork;
- } else {
- return defaultDaprNetwork;
- }
- } else {
- return Network.newNetwork();
- }
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/TestWorkflowPatternsApplication.java b/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/TestWorkflowPatternsApplication.java
deleted file mode 100644
index f156e56eea..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/TestWorkflowPatternsApplication.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp;
-
-import io.dapr.springboot4.examples.wfp.WorkflowPatternsApplication;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class TestWorkflowPatternsApplication {
-
- public static void main(String[] args) {
-
- SpringApplication.from(WorkflowPatternsApplication::main)
- .with(DaprTestContainersConfig.class)
- .run(args);
- org.testcontainers.Testcontainers.exposeHostPorts(8080);
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsAppIT.java b/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsAppIT.java
deleted file mode 100644
index 626bbf3849..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/test/java/io/dapr/springboot4/examples/wfp/WorkflowPatternsAppIT.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright 2025 The Dapr 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
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package io.dapr.springboot4.examples.wfp;
-
-import io.dapr.springboot.DaprAutoConfiguration;
-import io.dapr.springboot4.examples.wfp.continueasnew.CleanUpLog;
-import io.dapr.springboot4.examples.wfp.externalevent.Decision;
-import io.dapr.springboot4.examples.wfp.fanoutin.Result;
-import io.dapr.springboot4.examples.wfp.remoteendpoint.Payload;
-import io.dapr.springboot4.examples.wfp.timer.TimerLogService;
-import io.dapr.workflows.client.WorkflowRuntimeStatus;
-import io.github.microcks.testcontainers.MicrocksContainersEnsemble;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.web.server.LocalServerPort;
-import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.client.RestTestClient;
-
-import java.time.Duration;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import static org.awaitility.Awaitility.await;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Integration tests for Dapr Workflow Patterns.
- *
- * DEBUGGING: For more detailed logs during test execution, you can:
- * 1. Run `docker ps` to find the Dapr container ID
- * 2. Run `docker logs --follow ` to stream real-time logs
- * 3. The container name will typically be something like "dapr-workflow-patterns-app-"
- *
- * Example:
- * ```bash
- * docker ps | grep dapr
- * docker logs --follow
- * ```
- *
- * This will show you detailed Dapr runtime logs including workflow execution,
- * state transitions, and component interactions.
- */
-@SpringBootTest(classes = {TestWorkflowPatternsApplication.class, DaprTestContainersConfig.class,
- DaprAutoConfiguration.class, },
- webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
-class WorkflowPatternsAppIT {
-
- @Autowired
- private MicrocksContainersEnsemble ensemble;
-
- @Autowired
- private TimerLogService logService;
-
- @LocalServerPort
- private int port;
-
- private RestTestClient client;
-
- @BeforeEach
- void setUp() {
- client = RestTestClient.bindToServer()
- .baseUrl("http://localhost:" + port)
- .build();
- org.testcontainers.Testcontainers.exposeHostPorts(8080);
- logService.clearLog();
- }
-
-
- @Test
- void testChainWorkflow() {
- String result = client.post()
- .uri("/wfp/chain")
- .contentType(MediaType.APPLICATION_JSON)
- .body("")
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertNotNull(result);
- assertTrue(result.contains("TOKYO, LONDON, SEATTLE"));
- }
-
- @Test
- void testChildWorkflow() {
- String result = client.post()
- .uri("/wfp/child")
- .contentType(MediaType.APPLICATION_JSON)
- .body("")
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertNotNull(result);
- assertTrue(result.contains("!wolfkroW rpaD olleH"));
- }
-
- @Test
- void testFanOutIn() {
- List listOfStrings = Arrays.asList(
- "Hello, world!",
- "The quick brown fox jumps over the lazy dog.",
- "If a tree falls in the forest and there is no one there to hear it, does it make a sound?",
- "The greatest glory in living lies not in never falling, but in rising every time we fall.",
- "Always remember that you are absolutely unique. Just like everyone else.");
-
- Result result = client.post()
- .uri("/wfp/fanoutin")
- .contentType(MediaType.APPLICATION_JSON)
- .body(listOfStrings)
- .exchange()
- .expectStatus().isOk()
- .returnResult(Result.class)
- .getResponseBody();
-
- assertNotNull(result);
- assertEquals(60, result.getWordCount());
- }
-
- @Test
- void testExternalEventApprove() {
-
- String instanceId = client.post()
- .uri(uriBuilder -> uriBuilder
- .path("/wfp/externalevent")
- .queryParam("orderId", "123")
- .build())
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertNotNull(instanceId);
-
- Decision decision = client.post()
- .uri(uriBuilder -> uriBuilder
- .path("/wfp/externalevent-continue")
- .queryParam("orderId", "123")
- .queryParam("decision", true)
- .build())
- .exchange()
- .expectStatus().isOk()
- .returnResult(Decision.class)
- .getResponseBody();
-
- assertNotNull(decision);
- assertTrue(decision.getApproved());
- }
-
- @Test
- void testExternalEventDeny() {
-
- String instanceId = client.post()
- .uri(uriBuilder -> uriBuilder
- .path("/wfp/externalevent")
- .queryParam("orderId", "123")
- .build())
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertNotNull(instanceId);
-
- Decision decision = client.post()
- .uri(uriBuilder -> uriBuilder
- .path("/wfp/externalevent-continue")
- .queryParam("orderId", "123")
- .queryParam("decision", false)
- .build())
- .exchange()
- .expectStatus().isOk()
- .returnResult(Decision.class)
- .getResponseBody();
-
- assertNotNull(decision);
- assertEquals(false, decision.getApproved());
- }
-
-
- /**
- * Tests the ContinueAsNew workflow pattern.
- *
- * The ContinueAsNew pattern should execute cleanup activities 5 times
- * with 5-second intervals between each iteration.
- */
- @Test
- void testContinueAsNew() {
- //This call blocks until all the clean up activities are executed
- CleanUpLog cleanUpLog = client.post()
- .uri("/wfp/continueasnew")
- .contentType(MediaType.APPLICATION_JSON)
- .body("")
- .exchange()
- .expectStatus().isOk()
- .returnResult(CleanUpLog.class)
- .getResponseBody();
-
- assertNotNull(cleanUpLog);
- assertEquals(5, cleanUpLog.getCleanUpTimes());
- }
-
- @Test
- void testRemoteEndpoint() {
-
- Payload payload = client.post()
- .uri("/wfp/remote-endpoint")
- .contentType(MediaType.APPLICATION_JSON)
- .body(new Payload("123", "content goes here"))
- .exchange()
- .expectStatus().isOk()
- .returnResult(Payload.class)
- .getResponseBody();
-
- assertNotNull(payload);
- assertTrue(payload.getProcessed());
-
- assertEquals(2, ensemble.getMicrocksContainer()
- .getServiceInvocationsCount("API Payload Processor", "1.0.0"));
- }
-
- @Test
- void testSuspendResume() {
-
- String instanceId = client.post()
- .uri(uriBuilder -> uriBuilder
- .path("/wfp/suspendresume")
- .queryParam("orderId", "123")
- .build())
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertNotNull(instanceId);
-
- // The workflow is waiting on an event, let's suspend the workflow
- String state = client.post()
- .uri(uriBuilder -> uriBuilder
- .path("/wfp/suspendresume/suspend")
- .queryParam("orderId", "123")
- .build())
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertEquals(WorkflowRuntimeStatus.SUSPENDED.name(), state);
-
- // The let's resume the suspended workflow and check the state
- state = client.post()
- .uri(uriBuilder -> uriBuilder
- .path("/wfp/suspendresume/resume")
- .queryParam("orderId", "123")
- .build())
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertEquals(WorkflowRuntimeStatus.RUNNING.name(), state);
-
- // Now complete the workflow by sending an event
- Decision decision = client.post()
- .uri(uriBuilder -> uriBuilder
- .path("/wfp/suspendresume/continue")
- .queryParam("orderId", "123")
- .queryParam("decision", false)
- .build())
- .exchange()
- .expectStatus().isOk()
- .returnResult(Decision.class)
- .getResponseBody();
-
- assertNotNull(decision);
- assertEquals(false, decision.getApproved());
-
- }
-
- @Test
- void testDurationTimer() throws InterruptedException {
-
- String instanceId = client.post()
- .uri("/wfp/durationtimer")
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertNotNull(instanceId);
-
- // Check that the workflow completed successfully
- await().atMost(Duration.ofSeconds(30))
- .pollDelay(500, TimeUnit.MILLISECONDS)
- .pollInterval(500, TimeUnit.MILLISECONDS)
- .until(() -> {
- System.out.println("Log Size: " + logService.getLogDates().size());
- if( logService.getLogDates().size() == 2 ) {
- long diffInMillis = Math.abs(logService.getLogDates().get(1).getTime() - logService.getLogDates().get(0).getTime());
- long diff = TimeUnit.SECONDS.convert(diffInMillis, TimeUnit.MILLISECONDS);
- System.out.println("First Log at: " + logService.getLogDates().get(0));
- System.out.println("Second Log at: " + logService.getLogDates().get(1));
- System.out.println("Diff in seconds: " + diff);
- // The updated time differences should be between 9 and 11 seconds
- return diff >= 9 && diff <= 11;
- }
- return false;
- });
- }
-
- @Test
- void testZonedDateTimeTimer() throws InterruptedException {
-
- String instanceId = client.post()
- .uri("/wfp/zoneddatetimetimer")
- .exchange()
- .expectStatus().isOk()
- .returnResult(String.class)
- .getResponseBody();
-
- assertNotNull(instanceId);
-
- // Check that the workflow completed successfully
- await().atMost(Duration.ofSeconds(30))
- .pollDelay(500, TimeUnit.MILLISECONDS)
- .pollInterval(500, TimeUnit.MILLISECONDS)
- .until(() -> {
- System.out.println("Log Size: " + logService.getLogDates().size());
- if( logService.getLogDates().size() == 2 ) {
- long diffInMillis = Math.abs(logService.getLogDates().get(1).getTime() - logService.getLogDates().get(0).getTime());
- long diff = TimeUnit.SECONDS.convert(diffInMillis, TimeUnit.MILLISECONDS);
- System.out.println("First Log at: " + logService.getLogDates().get(0));
- System.out.println("Second Log at: " + logService.getLogDates().get(1));
- System.out.println("Diff in seconds: " + diff);
- // The updated time differences should be between 9 and 11 seconds
- return diff >= 9 && diff <= 11;
- }
- return false;
- });
- }
-
-}
diff --git a/spring-boot-4-examples/workflows/patterns/src/test/resources/application.properties b/spring-boot-4-examples/workflows/patterns/src/test/resources/application.properties
deleted file mode 100644
index 7fd4ccd5b9..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/test/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-spring.application.name=workflow-patterns-app
diff --git a/spring-boot-4-examples/workflows/patterns/src/test/resources/third-parties/remote-http-service.yaml b/spring-boot-4-examples/workflows/patterns/src/test/resources/third-parties/remote-http-service.yaml
deleted file mode 100644
index 59819a2829..0000000000
--- a/spring-boot-4-examples/workflows/patterns/src/test/resources/third-parties/remote-http-service.yaml
+++ /dev/null
@@ -1,87 +0,0 @@
----
-openapi: 3.0.2
-info:
- title: API Payload Processor
- version: 1.0.0
- description: API definition of API Payload Processor sample app
- contact:
- name: Salaboy
- url: http://github.com/salaboy
- email: salaboy@gmail.com
- license:
- name: MIT License
- url: https://opensource.org/licenses/MIT
-paths:
- /process:
- summary: Process payload
- post:
- tags:
- - process
- x-microcks-operation:
- dispatcher: SCRIPT
- dispatcherRules: |
- def retries = store.get("retries") ?:"first"
- if (retries == "first") {
- store.put("retries", "second", 60)
- return "Error"
- }
- store.delete("retries")
- return "Payload"
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Payload'
- required: true
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Payload'
- examples:
- Payload:
- value:
- id: 123
- content: payload content here
- processed: true
- description: Process payload
- "500":
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- type: string
- description: Error message
- examples:
- Error:
- value:
- message: Something unexpected happened
- description: Error payload
- operationId: Process
- summary: Process incoming payload
-components:
- schemas:
- Payload:
- title: Payload to be processed
- description: Payload to be processed following the Payload type's schema.
- type: object
- properties:
- id:
- description: Payload Id
- type: string
- content:
- description: Payload Content
- type: string
- processed:
- description: Is the Payload processed
- type: boolean
- required:
- - id
- - content
- additionalProperties: false
-tags:
- - name: payload
- description: Payload resource
diff --git a/spring-boot-4-examples/workflows/pom.xml b/spring-boot-4-examples/workflows/pom.xml
deleted file mode 100644
index 41ed1dea9e..0000000000
--- a/spring-boot-4-examples/workflows/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
- 4.0.0
-
- io.dapr
- spring-boot-4-examples
- 1.19.0-SNAPSHOT
- ../pom.xml
-
-
- sb4-workflows
- pom
-
-
- true
-
-
-
- patterns
- multi-app
-
-
-
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
-
-
- true
-
-
-
-
-
diff --git a/spring-boot-4-examples/workflows/spotbugs-exclude.xml b/spring-boot-4-examples/workflows/spotbugs-exclude.xml
deleted file mode 100644
index 264fc79b0a..0000000000
--- a/spring-boot-4-examples/workflows/spotbugs-exclude.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/spring-boot-examples/consumer-app/pom.xml b/spring-boot-examples/consumer-app/pom.xml
index bf37b4ef70..a80d806d4c 100644
--- a/spring-boot-examples/consumer-app/pom.xml
+++ b/spring-boot-examples/consumer-app/pom.xml
@@ -11,12 +11,12 @@
consumer-app
consumer-app
- Spring Boot, Testcontainers and Dapr Integration Examples :: Consumer App
+ Spring Boot 4, Testcontainers and Dapr Integration Examples :: Consumer App
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
@@ -51,11 +51,6 @@
testcontainers-kafka
test
-
- io.rest-assured
- rest-assured
- test
-
org.junit.jupiter
junit-jupiter-api
@@ -63,7 +58,7 @@
org.springframework.boot
- spring-boot-starter-test
+ spring-boot-starter-webmvc-test
test
diff --git a/spring-boot-examples/consumer-app/src/test/java/io/dapr/springboot/examples/consumer/ConsumerAppIT.java b/spring-boot-examples/consumer-app/src/test/java/io/dapr/springboot/examples/consumer/ConsumerAppIT.java
index 5334f49520..82718ca2ec 100644
--- a/spring-boot-examples/consumer-app/src/test/java/io/dapr/springboot/examples/consumer/ConsumerAppIT.java
+++ b/spring-boot-examples/consumer-app/src/test/java/io/dapr/springboot/examples/consumer/ConsumerAppIT.java
@@ -17,19 +17,17 @@
import io.dapr.spring.messaging.DaprMessagingTemplate;
import io.dapr.springboot.DaprAutoConfiguration;
import io.dapr.testcontainers.DaprContainer;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.server.LocalServerPort;
+import org.springframework.test.web.servlet.client.RestTestClient;
import org.testcontainers.containers.wait.strategy.Wait;
-import java.io.IOException;
import java.time.Duration;
-import static io.restassured.RestAssured.given;
import static org.awaitility.Awaitility.await;
import static org.hamcrest.CoreMatchers.equalTo;
@@ -53,6 +51,11 @@ class ConsumerAppIT {
@Autowired
private DaprContainer daprContainer;
+ @LocalServerPort
+ private int port;
+
+ private RestTestClient client;
+
@BeforeAll
public static void setup() {
org.testcontainers.Testcontainers.exposeHostPorts(8081);
@@ -60,21 +63,22 @@ public static void setup() {
@BeforeEach
void setUp() {
- RestAssured.baseURI = "http://localhost:" + 8081;
+ client = RestTestClient.bindToServer()
+ .baseUrl("http://localhost:" + port)
+ .build();
Wait.forLogMessage(SUBSCRIPTION_MESSAGE_PATTERN, 1).waitUntilReady(daprContainer);
}
@Test
- void testMessageConsumer() throws InterruptedException, IOException {
+ void testMessageConsumer() throws InterruptedException {
messagingTemplate.send("topic", new Order("abc-123", "the mars volta LP", 1));
- given().contentType(ContentType.JSON)
- .when()
- .get("/events")
- .then()
- .statusCode(200);
+ client.get()
+ .uri("/events")
+ .exchange()
+ .expectStatus().isOk();
await().atMost(Duration.ofSeconds(10))
.until(subscriberRestController.getAllEvents()::size, equalTo(1));
diff --git a/spring-boot-examples/pom.xml b/spring-boot-examples/pom.xml
index 83448f699d..f65cdee97a 100644
--- a/spring-boot-examples/pom.xml
+++ b/spring-boot-examples/pom.xml
@@ -15,6 +15,9 @@
true
+ 4.0.5
+
+ 6.0.2
@@ -23,6 +26,41 @@
workflows
+
+
+
+
+ tools.jackson
+ jackson-bom
+ 3.1.1
+ pom
+ import
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${springboot4.version}
+ pom
+ import
+
+
+ org.springframework.boot
+ spring-boot-starter-webmvc
+ ${springboot4.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-webmvc-test
+ ${springboot4.version}
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-restclient
+ ${springboot4.version}
+
+
+
diff --git a/spring-boot-examples/producer-app/pom.xml b/spring-boot-examples/producer-app/pom.xml
index 9930e169ca..a92e179256 100644
--- a/spring-boot-examples/producer-app/pom.xml
+++ b/spring-boot-examples/producer-app/pom.xml
@@ -12,7 +12,7 @@
producer-app
producer-app
- Spring Boot, Testcontainers and Dapr Integration Examples :: Producer App
+ Spring Boot 4, Testcontainers and Dapr Integration Examples :: Producer App
@@ -21,11 +21,11 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
- spring-boot-starter-test
+ spring-boot-starter-webmvc-test
test
@@ -47,11 +47,6 @@
testcontainers-rabbitmq
test
-
- io.rest-assured
- rest-assured
- test
-
diff --git a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Jackson3SerializerConfiguration.java b/spring-boot-examples/producer-app/src/main/java/io/dapr/springboot/examples/producer/Jackson3SerializerConfiguration.java
similarity index 89%
rename from spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Jackson3SerializerConfiguration.java
rename to spring-boot-examples/producer-app/src/main/java/io/dapr/springboot/examples/producer/Jackson3SerializerConfiguration.java
index 2dc6b44ea3..62356d8292 100644
--- a/spring-boot-4-examples/producer-app/src/main/java/io/dapr/springboot4/examples/producer/Jackson3SerializerConfiguration.java
+++ b/spring-boot-examples/producer-app/src/main/java/io/dapr/springboot/examples/producer/Jackson3SerializerConfiguration.java
@@ -11,10 +11,10 @@
limitations under the License.
*/
-package io.dapr.springboot4.examples.producer;
+package io.dapr.springboot.examples.producer;
import io.dapr.serializer.DaprObjectSerializer;
-import io.dapr.spring.boot4.autoconfigure.client.Jackson3ObjectSerializer;
+import io.dapr.spring.boot.autoconfigure.client.Jackson3ObjectSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import tools.jackson.databind.DeserializationFeature;
@@ -26,7 +26,7 @@
* backed by a customized Jackson 3 {@link JsonMapper}.
*
* By defining a {@link DaprObjectSerializer} bean here, the default auto-configured
- * serializer from {@code DaprJackson3SB4AutoConfiguration} is skipped (due to
+ * serializer from {@code DaprJackson3AutoConfiguration} is skipped (due to
* {@code @ConditionalOnMissingBean}).
*
*
To use the default auto-configured serializer instead, simply remove or
diff --git a/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/ProducerAppIT.java b/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/ProducerAppIT.java
index 195fd032b5..e8918eb944 100644
--- a/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/ProducerAppIT.java
+++ b/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/ProducerAppIT.java
@@ -15,27 +15,32 @@
import io.dapr.client.DaprClient;
import io.dapr.springboot.DaprAutoConfiguration;
+import io.dapr.springboot.examples.producer.Customer;
+import io.dapr.springboot.examples.producer.CustomerStore;
+import io.dapr.springboot.examples.producer.OrderDTO;
import io.dapr.springboot.examples.producer.workflow.CustomerFollowupActivity;
import io.dapr.springboot.examples.producer.workflow.CustomerWorkflow;
import io.dapr.springboot.examples.producer.workflow.RegisterCustomerActivity;
import io.dapr.testcontainers.DaprContainer;
import io.dapr.testcontainers.wait.strategy.DaprWait;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.server.LocalServerPort;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.client.RestTestClient;
-import java.io.IOException;
import java.time.Duration;
+import java.util.List;
-import static io.restassured.RestAssured.given;
import static org.awaitility.Awaitility.await;
import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
@SpringBootTest(classes = {TestProducerApplication.class, DaprTestContainersConfig.class,
DaprAutoConfiguration.class, CustomerWorkflow.class, CustomerFollowupActivity.class,
@@ -52,14 +57,19 @@ class ProducerAppIT {
@Autowired
private DaprClient daprClient;
-
@Autowired
private DaprContainer daprContainer;
+ @LocalServerPort
+ private int port;
+
+ private RestTestClient client;
@BeforeEach
void setUp() {
- RestAssured.baseURI = "http://localhost:" + 8080;
+ client = RestTestClient.bindToServer()
+ .baseUrl("http://localhost:" + port)
+ .build();
org.testcontainers.Testcontainers.exposeHostPorts(8080);
DaprWait.forSubscription("pubsub", "topic").waitUntilReady(daprContainer);
@@ -74,89 +84,124 @@ void cleanUp() {
void testOrdersOutboxEndpointAndMessaging() {
OrderDTO order = new OrderDTO("outbox-order-123", "Lorem ipsum", 1000);
- given().contentType(ContentType.JSON)
+ client.post()
+ .uri("/orders/outbox")
+ .contentType(MediaType.APPLICATION_JSON)
.body(order)
- .when()
- .post("/orders/outbox")
- .then()
- .statusCode(200);
+ .exchange()
+ .expectStatus().isOk();
await().atMost(Duration.ofSeconds(15))
.until(controller.getAllEvents()::size, equalTo(1));
}
- @Test
- void testOrdersEndpointAndMessaging() {
- OrderDTO order = new OrderDTO("abc-123", "the mars volta LP", 1);
- given().contentType(ContentType.JSON)
- .body(order)
- .when()
- .post("/orders")
- .then()
- .statusCode(200);
-
- await().atMost(Duration.ofSeconds(15))
- .until(controller.getAllEvents()::size, equalTo(1));
-
- given().contentType(ContentType.JSON)
- .when()
- .get("/orders")
- .then()
- .statusCode(200).body("size()", is(1));
-
- given().contentType(ContentType.JSON)
- .when()
- .queryParam("item", "the mars volta LP")
- .get("/orders/byItem/")
- .then()
- .statusCode(200).body("size()", is(1));
-
- given().contentType(ContentType.JSON)
- .when()
- .queryParam("item", "other")
- .get("/orders/byItem/")
- .then()
- .statusCode(200).body("size()", is(0));
-
- given().contentType(ContentType.JSON)
- .when()
- .queryParam("amount", 1)
- .get("/orders/byAmount/")
- .then()
- .statusCode(200).body("size()", is(1));
-
- given().contentType(ContentType.JSON)
- .when()
- .queryParam("amount", 2)
- .get("/orders/byAmount/")
- .then()
- .statusCode(200).body("size()", is(0));
-
- }
+// @Test
+// void testOrdersEndpointAndMessaging() {
+// OrderDTO order = new OrderDTO("abc-123", "the mars volta LP", 1);
+//
+// client.post()
+// .uri("/orders")
+// .contentType(MediaType.APPLICATION_JSON)
+// .body(order)
+// .exchange()
+// .expectStatus().isOk();
+//
+// await().atMost(Duration.ofSeconds(15))
+// .until(controller.getAllEvents()::size, equalTo(1));
+//
+// // Get all orders
+// List orders = client.get()
+// .uri("/orders")
+// .exchange()
+// .expectStatus().isOk()
+// .returnResult(new ParameterizedTypeReference>() {})
+// .getResponseBody();
+//
+// assertNotNull(orders);
+// assertEquals(1, orders.size());
+//
+// // Query by item
+// List ordersByItem = client.get()
+// .uri(uriBuilder -> uriBuilder
+// .path("/orders/byItem/")
+// .queryParam("item", "the mars volta LP")
+// .build())
+// .exchange()
+// .expectStatus().isOk()
+// .returnResult(new ParameterizedTypeReference>() {})
+// .getResponseBody();
+//
+// assertNotNull(ordersByItem);
+// assertEquals(1, ordersByItem.size());
+//
+// // Query by item - no match
+// List ordersByOtherItem = client.get()
+// .uri(uriBuilder -> uriBuilder
+// .path("/orders/byItem/")
+// .queryParam("item", "other")
+// .build())
+// .exchange()
+// .expectStatus().isOk()
+// .returnResult(new ParameterizedTypeReference>() {})
+// .getResponseBody();
+//
+// assertNotNull(ordersByOtherItem);
+// assertEquals(0, ordersByOtherItem.size());
+//
+// // Query by amount
+// List ordersByAmount = client.get()
+// .uri(uriBuilder -> uriBuilder
+// .path("/orders/byAmount/")
+// .queryParam("amount", 1)
+// .build())
+// .exchange()
+// .expectStatus().isOk()
+// .returnResult(new ParameterizedTypeReference>() {})
+// .getResponseBody();
+//
+// assertNotNull(ordersByAmount);
+// assertEquals(1, ordersByAmount.size());
+//
+// // Query by amount - no match
+// List ordersByOtherAmount = client.get()
+// .uri(uriBuilder -> uriBuilder
+// .path("/orders/byAmount/")
+// .queryParam("amount", 2)
+// .build())
+// .exchange()
+// .expectStatus().isOk()
+// .returnResult(new ParameterizedTypeReference>() {})
+// .getResponseBody();
+//
+// assertNotNull(ordersByOtherAmount);
+// assertEquals(0, ordersByOtherAmount.size());
+//
+// }
@Test
void testCustomersWorkflows() {
- given().contentType(ContentType.JSON)
- .body("{\"customerName\": \"salaboy\"}")
- .when()
- .post("/customers")
- .then()
- .statusCode(200);
+ client.post()
+ .uri("/customers")
+ .contentType(MediaType.APPLICATION_JSON)
+ .body("{\"customerName\": \"salaboy\"}")
+ .exchange()
+ .expectStatus().isOk();
await().atMost(Duration.ofSeconds(15))
.until(customerStore.getCustomers()::size, equalTo(1));
Customer customer = customerStore.getCustomer("salaboy");
- assertEquals(true, customer.isInCustomerDB());
+ assertTrue(customer.isInCustomerDB());
String workflowId = customer.getWorkflowId();
- given().contentType(ContentType.JSON)
- .body("{ \"workflowId\": \"" + workflowId + "\",\"customerName\": \"salaboy\" }")
- .when()
- .post("/customers/followup")
- .then()
- .statusCode(200);
+
+ client.post()
+ .uri("/customers/followup")
+ .contentType(MediaType.APPLICATION_JSON)
+ .body("{ \"workflowId\": \"" + workflowId + "\",\"customerName\": \"salaboy\" }")
+ .exchange()
+ .expectStatus().isOk();
assertEquals(1, customerStore.getCustomers().size());
diff --git a/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestProducerApplication.java b/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestProducerApplication.java
index 0abb4c9291..2bdac1efbb 100644
--- a/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestProducerApplication.java
+++ b/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestProducerApplication.java
@@ -13,6 +13,7 @@
package io.dapr.springboot.examples.producer;
+import io.dapr.springboot.examples.producer.ProducerApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestSubscriberRestController.java b/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestSubscriberRestController.java
index 0f69e28aa2..17951522cf 100644
--- a/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestSubscriberRestController.java
+++ b/spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestSubscriberRestController.java
@@ -15,6 +15,7 @@
import io.dapr.Topic;
import io.dapr.client.domain.CloudEvent;
+import io.dapr.springboot.examples.producer.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
diff --git a/spring-boot-examples/workflows/multi-app/README.md b/spring-boot-examples/workflows/multi-app/README.md
index 2213289c3b..70af5a1681 100644
--- a/spring-boot-examples/workflows/multi-app/README.md
+++ b/spring-boot-examples/workflows/multi-app/README.md
@@ -40,7 +40,7 @@ You can create new workflow instances of the `CustomerWorkflow` by calling the `
curl -X POST localhost:8080/customers -H 'Content-Type: application/json' -d '{ "customerName": "salaboy" }'
```
-The workflow definition [`CustomerWorkflow`](orchestrator/src/main/java/io/dapr/springboot/examples/orchestrator/CustomerWorkflow.java) that you can find inside the `orchestrator` app,
+The workflow definition [`CustomerWorkflow`](orchestrator/src/main/java/io/dapr/springboot4/examples/orchestrator/CustomerWorkflow.java) that you can find inside the `orchestrator` app,
performs the following orchestration when a new workflow instance is created:
- Call the `RegisterCustomerActivity` activity which can be found inside the `worker-one` application.
@@ -83,9 +83,9 @@ performs the following orchestration when a new workflow instance is created:
Testing becomes a complex task when you are dealing with multiple Spring Boot applications. For testing this workflow,
we rely on [Testcontainers](https://testcontainers.com) to create the entire setup which enable us to run the workflow end to end.
-You can find the end-to-end test in the [`OrchestratorAppIT.java`](orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/OrchestratorAppIT.java) class inside the `orchestrator` application.
+You can find the end-to-end test in the [`OrchestratorAppIT.java`](orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/OrchestratorAppIT.java) class inside the `orchestrator` application.
This test interact with the application REST endpoints to validate their correct execution.
-But the magic behind the test can be located in the [`DaprTestContainersConfig.class`](orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/DaprTestContainersConfig.java) which defines the configuration for
+But the magic behind the test can be located in the [`DaprTestContainersConfig.class`](orchestrator/src/test/java/io/dapr/springboot4/examples/orchestrator/DaprTestContainersConfig.java) which defines the configuration for
all the Dapr containers and the `worker-one` and `worker-two` applications. Check this class to gain a deeper understand how to configure
multiple Dapr-enabled applications.
diff --git a/spring-boot-examples/workflows/multi-app/orchestrator/pom.xml b/spring-boot-examples/workflows/multi-app/orchestrator/pom.xml
index 6c087142ad..94f137b17e 100644
--- a/spring-boot-examples/workflows/multi-app/orchestrator/pom.xml
+++ b/spring-boot-examples/workflows/multi-app/orchestrator/pom.xml
@@ -12,7 +12,7 @@
orchestrator
orchestrator
- Spring Boot, Testcontainers and Dapr Integration Examples :: Orchestrator App
+ Spring Boot 4, Testcontainers and Dapr Integration Examples :: Orchestrator App
@@ -21,11 +21,11 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
- spring-boot-starter-test
+ spring-boot-starter-webmvc-test
test
@@ -42,11 +42,6 @@
testcontainers-redis
test
-
- io.rest-assured
- rest-assured
- test
-
io.dapr
diff --git a/spring-boot-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/OrchestratorAppIT.java b/spring-boot-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/OrchestratorAppIT.java
index 772ec82c05..8ffbb6ab40 100644
--- a/spring-boot-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/OrchestratorAppIT.java
+++ b/spring-boot-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/OrchestratorAppIT.java
@@ -13,17 +13,19 @@
package io.dapr.springboot.examples.orchestrator;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
+import io.dapr.springboot.examples.orchestrator.Customer;
+import io.dapr.springboot.examples.orchestrator.CustomersRestController;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.server.LocalServerPort;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.client.RestTestClient;
-import java.io.IOException;
import java.time.Duration;
-import static io.restassured.RestAssured.given;
import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@SpringBootTest(classes = {TestOrchestratorApplication.class, DaprTestContainersConfig.class, CustomersRestController.class},
@@ -31,68 +33,80 @@
properties = {"reuse=false", "tests.workers.enabled=true"})
class OrchestratorAppIT {
+ @LocalServerPort
+ private int port;
+
+ private RestTestClient client;
@BeforeEach
void setUp() {
- RestAssured.baseURI = "http://localhost:" + 8080;
+ client = RestTestClient.bindToServer()
+ .baseUrl("http://localhost:" + port)
+ .build();
org.testcontainers.Testcontainers.exposeHostPorts(8080);
}
@Test
- void testCustomersWorkflows() throws InterruptedException, IOException {
+ void testCustomersWorkflows() throws InterruptedException {
// Create a new workflow instance for a given customer
- given().contentType(ContentType.JSON)
- .body("{\"customerName\": \"salaboy\"}")
- .when()
- .post("/customers")
- .then()
- .statusCode(200);
+ client.post()
+ .uri("/customers")
+ .contentType(MediaType.APPLICATION_JSON)
+ .body("{\"customerName\": \"salaboy\"}")
+ .exchange()
+ .expectStatus().isOk();
// Wait for the workflow instance to be running by checking the status
await().atMost(Duration.ofSeconds(5)).until(() ->
{
- String workflowStatus = given().contentType(ContentType.JSON)
+ String workflowStatus = client.post()
+ .uri("/customers/status")
+ .contentType(MediaType.APPLICATION_JSON)
.body("{\"customerName\": \"salaboy\" }")
- .when()
- .post("/customers/status")
- .then()
- .statusCode(200)
- .extract().asString();
- return workflowStatus.equals("Workflow for Customer: salaboy is RUNNING");
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
+ return "Workflow for Customer: salaboy is RUNNING".equals(workflowStatus);
}
);
// Raise an external event to move the workflow forward
- given().contentType(ContentType.JSON)
- .body("{\"customerName\": \"salaboy\" }")
- .when()
- .post("/customers/followup")
- .then()
- .statusCode(200);
+ client.post()
+ .uri("/customers/followup")
+ .contentType(MediaType.APPLICATION_JSON)
+ .body("{\"customerName\": \"salaboy\" }")
+ .exchange()
+ .expectStatus().isOk();
// Wait for the workflow instance to be completed by checking the status
await().atMost(Duration.ofSeconds(5)).until(() ->
{
- String workflowStatus = given().contentType(ContentType.JSON)
+ String workflowStatus = client.post()
+ .uri("/customers/status")
+ .contentType(MediaType.APPLICATION_JSON)
.body("{\"customerName\": \"salaboy\" }")
- .when()
- .post("/customers/status")
- .then()
- .statusCode(200).extract().asString();
- return workflowStatus.equals("Workflow for Customer: salaboy is COMPLETED");
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
+ return "Workflow for Customer: salaboy is COMPLETED".equals(workflowStatus);
}
);
// Get the customer after running all the workflow activities
- Customer customer = given().contentType(ContentType.JSON)
- .body("{\"customerName\": \"salaboy\" }")
- .when()
- .post("/customers/output")
- .then()
- .statusCode(200).extract().as(Customer.class);
-
+ Customer customer = client.post()
+ .uri("/customers/output")
+ .contentType(MediaType.APPLICATION_JSON)
+ .body("{\"customerName\": \"salaboy\" }")
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(Customer.class)
+ .getResponseBody();
+
+ assertNotNull(customer);
assertTrue(customer.isInCustomerDB());
assertTrue(customer.isFollowUp());
diff --git a/spring-boot-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/TestOrchestratorApplication.java b/spring-boot-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/TestOrchestratorApplication.java
index 9e2b4be77a..016e81a319 100644
--- a/spring-boot-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/TestOrchestratorApplication.java
+++ b/spring-boot-examples/workflows/multi-app/orchestrator/src/test/java/io/dapr/springboot/examples/orchestrator/TestOrchestratorApplication.java
@@ -13,6 +13,7 @@
package io.dapr.springboot.examples.orchestrator;
+import io.dapr.springboot.examples.orchestrator.OrchestratorApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-examples/workflows/multi-app/worker-one/pom.xml b/spring-boot-examples/workflows/multi-app/worker-one/pom.xml
index e2a6beba0c..f34910ed6a 100644
--- a/spring-boot-examples/workflows/multi-app/worker-one/pom.xml
+++ b/spring-boot-examples/workflows/multi-app/worker-one/pom.xml
@@ -12,7 +12,7 @@
worker-one
worker-one
- Spring Boot, Testcontainers and Dapr Integration Examples :: Worker 1 App
+ Spring Boot 4, Testcontainers and Dapr Integration Examples :: Worker 1 App
@@ -21,11 +21,11 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
- spring-boot-starter-test
+ spring-boot-starter-webmvc-test
test
@@ -42,11 +42,6 @@
testcontainers-redis
test
-
- io.rest-assured
- rest-assured
- test
-
diff --git a/spring-boot-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot/examples/workerone/TestWorkerOneApplication.java b/spring-boot-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot/examples/workerone/TestWorkerOneApplication.java
index 4e285ca0bf..b591c7dbff 100644
--- a/spring-boot-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot/examples/workerone/TestWorkerOneApplication.java
+++ b/spring-boot-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot/examples/workerone/TestWorkerOneApplication.java
@@ -13,6 +13,7 @@
package io.dapr.springboot.examples.workerone;
+import io.dapr.springboot.examples.workerone.WorkerOneApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot/examples/workerone/WorkerOneAppIT.java b/spring-boot-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot/examples/workerone/WorkerOneAppIT.java
index a4a9cbc4d9..65d1c6a027 100644
--- a/spring-boot-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot/examples/workerone/WorkerOneAppIT.java
+++ b/spring-boot-examples/workflows/multi-app/worker-one/src/test/java/io/dapr/springboot/examples/workerone/WorkerOneAppIT.java
@@ -13,23 +13,26 @@
package io.dapr.springboot.examples.workerone;
-import io.restassured.RestAssured;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-
-import static io.restassured.RestAssured.given;
-import static org.awaitility.Awaitility.await;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.springframework.boot.test.web.server.LocalServerPort;
+import org.springframework.test.web.servlet.client.RestTestClient;
@SpringBootTest(classes = {TestWorkerOneApplication.class, DaprTestContainersConfig.class},
webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class WorkerOneAppIT {
+ @LocalServerPort
+ private int port;
+
+ private RestTestClient client;
+
@BeforeEach
void setUp() {
- RestAssured.baseURI = "http://localhost:" + 8081;
+ client = RestTestClient.bindToServer()
+ .baseUrl("http://localhost:" + port)
+ .build();
org.testcontainers.Testcontainers.exposeHostPorts(8081);
}
diff --git a/spring-boot-examples/workflows/multi-app/worker-two/pom.xml b/spring-boot-examples/workflows/multi-app/worker-two/pom.xml
index 8722432ba0..4e081c2a32 100644
--- a/spring-boot-examples/workflows/multi-app/worker-two/pom.xml
+++ b/spring-boot-examples/workflows/multi-app/worker-two/pom.xml
@@ -12,7 +12,7 @@
worker-two
worker-two
- Spring Boot, Testcontainers and Dapr Integration Examples :: Worker 2 App
+ Spring Boot 4, Testcontainers and Dapr Integration Examples :: Worker 2 App
@@ -21,11 +21,11 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
- spring-boot-starter-test
+ spring-boot-starter-webmvc-test
test
@@ -42,11 +42,6 @@
testcontainers-redis
test
-
- io.rest-assured
- rest-assured
- test
-
diff --git a/spring-boot-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot/examples/workertwo/TestWorkerTwoApplication.java b/spring-boot-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot/examples/workertwo/TestWorkerTwoApplication.java
index 8fbdce15e1..049586c429 100644
--- a/spring-boot-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot/examples/workertwo/TestWorkerTwoApplication.java
+++ b/spring-boot-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot/examples/workertwo/TestWorkerTwoApplication.java
@@ -13,6 +13,7 @@
package io.dapr.springboot.examples.workertwo;
+import io.dapr.springboot.examples.workertwo.WorkerTwoApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot/examples/workertwo/WorkerTwoAppIT.java b/spring-boot-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot/examples/workertwo/WorkerTwoAppIT.java
index ed17115e8b..9823ebec4b 100644
--- a/spring-boot-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot/examples/workertwo/WorkerTwoAppIT.java
+++ b/spring-boot-examples/workflows/multi-app/worker-two/src/test/java/io/dapr/springboot/examples/workertwo/WorkerTwoAppIT.java
@@ -13,23 +13,26 @@
package io.dapr.springboot.examples.workertwo;
-import io.restassured.RestAssured;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-
-import static io.restassured.RestAssured.given;
-import static org.awaitility.Awaitility.await;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.springframework.boot.test.web.server.LocalServerPort;
+import org.springframework.test.web.servlet.client.RestTestClient;
@SpringBootTest(classes = {TestWorkerTwoApplication.class, DaprTestContainersConfig.class},
webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class WorkerTwoAppIT {
+ @LocalServerPort
+ private int port;
+
+ private RestTestClient client;
+
@BeforeEach
void setUp() {
- RestAssured.baseURI = "http://localhost:" + 8082;
+ client = RestTestClient.bindToServer()
+ .baseUrl("http://localhost:" + port)
+ .build();
org.testcontainers.Testcontainers.exposeHostPorts(8082);
}
diff --git a/spring-boot-examples/workflows/patterns/README.md b/spring-boot-examples/workflows/patterns/README.md
index 827064c88c..4f6b285dc0 100644
--- a/spring-boot-examples/workflows/patterns/README.md
+++ b/spring-boot-examples/workflows/patterns/README.md
@@ -34,7 +34,7 @@ timeout_seconds: 180
-By running the `spring-boot:test-run` goal, the application is loaded using the [test configurations](src/test/java/io/dapr/springboot/examples/wfp/DaprTestContainersConfig.java)
+By running the `spring-boot:test-run` goal, the application is loaded using the [test configurations](src/test/java/io/dapr/springboot4/examples/wfp/DaprTestContainersConfig.java)
configured using [Testcontainers](https://testcontainers.com) to boostrap the [Dapr](https://dapr.io) sidecar and control plane.
Once the application is running you can trigger the different patterns by sending the following requests:
@@ -509,4 +509,4 @@ i.d.s.e.w.s.PerformTaskActivity : Completing activity...
## Testing workflow executions
Workflow execution can be tested using Testcontainers and you can find all the tests for the patterns covered in this
-application [here](src/test/java/io/dapr/springboot/examples/wfp/TestWorkflowPatternsApplication.java).
+application [here](src/test/java/io/dapr/springboot4/examples/wfp/TestWorkflowPatternsApplication.java).
diff --git a/spring-boot-examples/workflows/patterns/pom.xml b/spring-boot-examples/workflows/patterns/pom.xml
index 1ad61a1c78..a3bb8a5f2f 100644
--- a/spring-boot-examples/workflows/patterns/pom.xml
+++ b/spring-boot-examples/workflows/patterns/pom.xml
@@ -12,7 +12,7 @@
patterns
patterns
- Spring Boot, Testcontainers and Dapr Integration Examples :: Workflows Patterns
+ Spring Boot 4, Testcontainers and Dapr Integration Examples :: Workflows Patterns
@@ -21,11 +21,15 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
- spring-boot-starter-test
+ spring-boot-starter-restclient
+
+
+ org.springframework.boot
+ spring-boot-starter-webmvc-test
test
@@ -37,11 +41,6 @@
dapr-spring-boot-starter-test
test
-
- io.rest-assured
- rest-assured
- test
-
io.github.microcks
microcks-testcontainers
diff --git a/spring-boot-examples/workflows/patterns/src/main/java/io/dapr/springboot/examples/wfp/WorkflowPatternsConfiguration.java b/spring-boot-examples/workflows/patterns/src/main/java/io/dapr/springboot/examples/wfp/WorkflowPatternsConfiguration.java
index 45f08ca17f..08937f87e3 100644
--- a/spring-boot-examples/workflows/patterns/src/main/java/io/dapr/springboot/examples/wfp/WorkflowPatternsConfiguration.java
+++ b/spring-boot-examples/workflows/patterns/src/main/java/io/dapr/springboot/examples/wfp/WorkflowPatternsConfiguration.java
@@ -15,7 +15,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import io.dapr.springboot.examples.wfp.continueasnew.CleanUpLog;
-import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.boot.restclient.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
diff --git a/spring-boot-examples/workflows/patterns/src/test/java/io/dapr/springboot/examples/wfp/TestWorkflowPatternsApplication.java b/spring-boot-examples/workflows/patterns/src/test/java/io/dapr/springboot/examples/wfp/TestWorkflowPatternsApplication.java
index 8459f8d50d..53a4f49580 100644
--- a/spring-boot-examples/workflows/patterns/src/test/java/io/dapr/springboot/examples/wfp/TestWorkflowPatternsApplication.java
+++ b/spring-boot-examples/workflows/patterns/src/test/java/io/dapr/springboot/examples/wfp/TestWorkflowPatternsApplication.java
@@ -13,6 +13,7 @@
package io.dapr.springboot.examples.wfp;
+import io.dapr.springboot.examples.wfp.WorkflowPatternsApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-examples/workflows/patterns/src/test/java/io/dapr/springboot/examples/wfp/WorkflowPatternsAppIT.java b/spring-boot-examples/workflows/patterns/src/test/java/io/dapr/springboot/examples/wfp/WorkflowPatternsAppIT.java
index 40ef080f5c..75e60eaf5f 100644
--- a/spring-boot-examples/workflows/patterns/src/test/java/io/dapr/springboot/examples/wfp/WorkflowPatternsAppIT.java
+++ b/spring-boot-examples/workflows/patterns/src/test/java/io/dapr/springboot/examples/wfp/WorkflowPatternsAppIT.java
@@ -15,43 +15,44 @@
import io.dapr.springboot.DaprAutoConfiguration;
import io.dapr.springboot.examples.wfp.continueasnew.CleanUpLog;
+import io.dapr.springboot.examples.wfp.externalevent.Decision;
+import io.dapr.springboot.examples.wfp.fanoutin.Result;
import io.dapr.springboot.examples.wfp.remoteendpoint.Payload;
import io.dapr.springboot.examples.wfp.timer.TimerLogService;
import io.dapr.workflows.client.WorkflowRuntimeStatus;
import io.github.microcks.testcontainers.MicrocksContainersEnsemble;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.server.LocalServerPort;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.client.RestTestClient;
import java.time.Duration;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
-import static io.restassured.RestAssured.given;
import static org.awaitility.Awaitility.await;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.Matchers.equalTo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Integration tests for Dapr Workflow Patterns.
- *
+ *
* DEBUGGING: For more detailed logs during test execution, you can:
* 1. Run `docker ps` to find the Dapr container ID
* 2. Run `docker logs --follow ` to stream real-time logs
* 3. The container name will typically be something like "dapr-workflow-patterns-app-"
- *
+ *
* Example:
* ```bash
* docker ps | grep dapr
* docker logs --follow
* ```
- *
+ *
* This will show you detailed Dapr runtime logs including workflow execution,
* state transitions, and component interactions.
*/
@@ -66,9 +67,16 @@ class WorkflowPatternsAppIT {
@Autowired
private TimerLogService logService;
+ @LocalServerPort
+ private int port;
+
+ private RestTestClient client;
+
@BeforeEach
void setUp() {
- RestAssured.baseURI = "http://localhost:" + 8080;
+ client = RestTestClient.bindToServer()
+ .baseUrl("http://localhost:" + port)
+ .build();
org.testcontainers.Testcontainers.exposeHostPorts(8080);
logService.clearLog();
}
@@ -76,22 +84,32 @@ void setUp() {
@Test
void testChainWorkflow() {
- given().contentType(ContentType.JSON)
+ String result = client.post()
+ .uri("/wfp/chain")
+ .contentType(MediaType.APPLICATION_JSON)
.body("")
- .when()
- .post("/wfp/chain")
- .then()
- .statusCode(200).body(containsString("TOKYO, LONDON, SEATTLE"));
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
+
+ assertNotNull(result);
+ assertTrue(result.contains("TOKYO, LONDON, SEATTLE"));
}
@Test
void testChildWorkflow() {
- given().contentType(ContentType.JSON)
+ String result = client.post()
+ .uri("/wfp/child")
+ .contentType(MediaType.APPLICATION_JSON)
.body("")
- .when()
- .post("/wfp/child")
- .then()
- .statusCode(200).body(containsString("!wolfkroW rpaD olleH"));
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
+
+ assertNotNull(result);
+ assertTrue(result.contains("!wolfkroW rpaD olleH"));
}
@Test
@@ -103,87 +121,116 @@ void testFanOutIn() {
"The greatest glory in living lies not in never falling, but in rising every time we fall.",
"Always remember that you are absolutely unique. Just like everyone else.");
- given().contentType(ContentType.JSON)
+ Result result = client.post()
+ .uri("/wfp/fanoutin")
+ .contentType(MediaType.APPLICATION_JSON)
.body(listOfStrings)
- .when()
- .post("/wfp/fanoutin")
- .then()
- .statusCode(200).body("wordCount",equalTo(60));
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(Result.class)
+ .getResponseBody();
+
+ assertNotNull(result);
+ assertEquals(60, result.getWordCount());
}
@Test
void testExternalEventApprove() {
- given()
- .queryParam("orderId", "123")
- .when()
- .post("/wfp/externalevent")
- .then()
- .statusCode(200).extract().asString();
-
+ String instanceId = client.post()
+ .uri(uriBuilder -> uriBuilder
+ .path("/wfp/externalevent")
+ .queryParam("orderId", "123")
+ .build())
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
+ assertNotNull(instanceId);
- given()
- .queryParam("orderId", "123")
- .queryParam("decision", true)
- .when()
- .post("/wfp/externalevent-continue")
- .then()
- .statusCode(200).body("approved", equalTo(true));
+ Decision decision = client.post()
+ .uri(uriBuilder -> uriBuilder
+ .path("/wfp/externalevent-continue")
+ .queryParam("orderId", "123")
+ .queryParam("decision", true)
+ .build())
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(Decision.class)
+ .getResponseBody();
+
+ assertNotNull(decision);
+ assertTrue(decision.getApproved());
}
@Test
void testExternalEventDeny() {
- given()
- .queryParam("orderId", "123")
- .when()
- .post("/wfp/externalevent")
- .then()
- .statusCode(200).extract().asString();
-
+ String instanceId = client.post()
+ .uri(uriBuilder -> uriBuilder
+ .path("/wfp/externalevent")
+ .queryParam("orderId", "123")
+ .build())
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
+ assertNotNull(instanceId);
- given()
- .queryParam("orderId", "123")
- .queryParam("decision", false)
- .when()
- .post("/wfp/externalevent-continue")
- .then()
- .statusCode(200).body("approved", equalTo(false));
+ Decision decision = client.post()
+ .uri(uriBuilder -> uriBuilder
+ .path("/wfp/externalevent-continue")
+ .queryParam("orderId", "123")
+ .queryParam("decision", false)
+ .build())
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(Decision.class)
+ .getResponseBody();
+
+ assertNotNull(decision);
+ assertEquals(false, decision.getApproved());
}
/**
* Tests the ContinueAsNew workflow pattern.
- *
+ *
* The ContinueAsNew pattern should execute cleanup activities 5 times
* with 5-second intervals between each iteration.
*/
@Test
void testContinueAsNew() {
//This call blocks until all the clean up activities are executed
- CleanUpLog cleanUpLog = given().contentType(ContentType.JSON)
+ CleanUpLog cleanUpLog = client.post()
+ .uri("/wfp/continueasnew")
+ .contentType(MediaType.APPLICATION_JSON)
.body("")
- .when()
- .post("/wfp/continueasnew")
- .then()
- .statusCode(200).extract().as(CleanUpLog.class);
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(CleanUpLog.class)
+ .getResponseBody();
+ assertNotNull(cleanUpLog);
assertEquals(5, cleanUpLog.getCleanUpTimes());
}
@Test
void testRemoteEndpoint() {
- Payload payload = given().contentType(ContentType.JSON)
+ Payload payload = client.post()
+ .uri("/wfp/remote-endpoint")
+ .contentType(MediaType.APPLICATION_JSON)
.body(new Payload("123", "content goes here"))
- .when()
- .post("/wfp/remote-endpoint")
- .then()
- .statusCode(200).extract().as(Payload.class);
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(Payload.class)
+ .getResponseBody();
- assertEquals(true, payload.getProcessed());
+ assertNotNull(payload);
+ assertTrue(payload.getProcessed());
assertEquals(2, ensemble.getMicrocksContainer()
.getServiceInvocationsCount("API Payload Processor", "1.0.0"));
@@ -192,54 +239,70 @@ void testRemoteEndpoint() {
@Test
void testSuspendResume() {
- String instanceId = given()
- .queryParam("orderId", "123")
- .when()
- .post("/wfp/suspendresume")
- .then()
- .statusCode(200).extract().asString();
+ String instanceId = client.post()
+ .uri(uriBuilder -> uriBuilder
+ .path("/wfp/suspendresume")
+ .queryParam("orderId", "123")
+ .build())
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
assertNotNull(instanceId);
// The workflow is waiting on an event, let's suspend the workflow
- String state = given()
- .queryParam("orderId", "123")
- .when()
- .post("/wfp/suspendresume/suspend")
- .then()
- .statusCode(200).extract().asString();
+ String state = client.post()
+ .uri(uriBuilder -> uriBuilder
+ .path("/wfp/suspendresume/suspend")
+ .queryParam("orderId", "123")
+ .build())
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
assertEquals(WorkflowRuntimeStatus.SUSPENDED.name(), state);
// The let's resume the suspended workflow and check the state
- state = given()
- .queryParam("orderId", "123")
- .when()
- .post("/wfp/suspendresume/resume")
- .then()
- .statusCode(200).extract().asString();
+ state = client.post()
+ .uri(uriBuilder -> uriBuilder
+ .path("/wfp/suspendresume/resume")
+ .queryParam("orderId", "123")
+ .build())
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
assertEquals(WorkflowRuntimeStatus.RUNNING.name(), state);
// Now complete the workflow by sending an event
- given()
- .queryParam("orderId", "123")
- .queryParam("decision", false)
- .when()
- .post("/wfp/suspendresume/continue")
- .then()
- .statusCode(200).body("approved", equalTo(false));
+ Decision decision = client.post()
+ .uri(uriBuilder -> uriBuilder
+ .path("/wfp/suspendresume/continue")
+ .queryParam("orderId", "123")
+ .queryParam("decision", false)
+ .build())
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(Decision.class)
+ .getResponseBody();
+
+ assertNotNull(decision);
+ assertEquals(false, decision.getApproved());
}
@Test
void testDurationTimer() throws InterruptedException {
- String instanceId = given()
- .when()
- .post("/wfp/durationtimer")
- .then()
- .statusCode(200).extract().asString();
+ String instanceId = client.post()
+ .uri("/wfp/durationtimer")
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
assertNotNull(instanceId);
@@ -265,11 +328,12 @@ void testDurationTimer() throws InterruptedException {
@Test
void testZonedDateTimeTimer() throws InterruptedException {
- String instanceId = given()
- .when()
- .post("/wfp/zoneddatetimetimer")
- .then()
- .statusCode(200).extract().asString();
+ String instanceId = client.post()
+ .uri("/wfp/zoneddatetimetimer")
+ .exchange()
+ .expectStatus().isOk()
+ .returnResult(String.class)
+ .getResponseBody();
assertNotNull(instanceId);
diff --git a/spring-boot-examples/workflows/versioning/full-version-worker-one/pom.xml b/spring-boot-examples/workflows/versioning/full-version-worker-one/pom.xml
index 330c136991..b5b54692cc 100644
--- a/spring-boot-examples/workflows/versioning/full-version-worker-one/pom.xml
+++ b/spring-boot-examples/workflows/versioning/full-version-worker-one/pom.xml
@@ -21,7 +21,7 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
diff --git a/spring-boot-examples/workflows/versioning/full-version-worker-two/pom.xml b/spring-boot-examples/workflows/versioning/full-version-worker-two/pom.xml
index 6e7b5a1e06..fc1d09d830 100644
--- a/spring-boot-examples/workflows/versioning/full-version-worker-two/pom.xml
+++ b/spring-boot-examples/workflows/versioning/full-version-worker-two/pom.xml
@@ -21,7 +21,7 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
diff --git a/spring-boot-examples/workflows/versioning/patch-version-worker-one/pom.xml b/spring-boot-examples/workflows/versioning/patch-version-worker-one/pom.xml
index 383f5e3b07..17eefe5285 100644
--- a/spring-boot-examples/workflows/versioning/patch-version-worker-one/pom.xml
+++ b/spring-boot-examples/workflows/versioning/patch-version-worker-one/pom.xml
@@ -21,7 +21,7 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
diff --git a/spring-boot-examples/workflows/versioning/patch-version-worker-two/pom.xml b/spring-boot-examples/workflows/versioning/patch-version-worker-two/pom.xml
index 1e9bd415d4..2d008d87fd 100644
--- a/spring-boot-examples/workflows/versioning/patch-version-worker-two/pom.xml
+++ b/spring-boot-examples/workflows/versioning/patch-version-worker-two/pom.xml
@@ -21,7 +21,7 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
diff --git a/spring-boot-examples/workflows/versioning/version-orchestrator/pom.xml b/spring-boot-examples/workflows/versioning/version-orchestrator/pom.xml
index cbd51cae32..b76f2f8524 100644
--- a/spring-boot-examples/workflows/versioning/version-orchestrator/pom.xml
+++ b/spring-boot-examples/workflows/versioning/version-orchestrator/pom.xml
@@ -21,7 +21,7 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-webmvc
org.springframework.boot
diff --git a/spring-boot-4-sdk-tests/pom.xml b/spring-boot-sdk-tests/pom.xml
similarity index 97%
rename from spring-boot-4-sdk-tests/pom.xml
rename to spring-boot-sdk-tests/pom.xml
index 1415619dd5..30d2af42af 100644
--- a/spring-boot-4-sdk-tests/pom.xml
+++ b/spring-boot-sdk-tests/pom.xml
@@ -10,7 +10,7 @@
../pom.xml
- spring-boot-4-sdk-tests
+ spring-boot-sdk-tests
17
@@ -72,12 +72,12 @@
io.dapr.spring
- dapr-spring-boot-4-starter
+ dapr-spring-boot-starter
test
io.dapr.spring
- dapr-spring-boot-4-starter-test
+ dapr-spring-boot-starter-test
test
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/ContainerConstants.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/ContainerConstants.java
similarity index 91%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/ContainerConstants.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/ContainerConstants.java
index 058703b78c..03bed57eac 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/ContainerConstants.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/ContainerConstants.java
@@ -1,4 +1,4 @@
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
import io.dapr.testcontainers.DaprContainerConstants;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprClientConfiguration.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprClientConfiguration.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprClientConfiguration.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprClientConfiguration.java
index dec0c98872..e1fefb73f5 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprClientConfiguration.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprClientConfiguration.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprClientFactory.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprClientFactory.java
similarity index 91%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprClientFactory.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprClientFactory.java
index e0556ce0ce..d7a6fe1330 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprClientFactory.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprClientFactory.java
@@ -1,4 +1,4 @@
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
import io.dapr.client.DaprClientBuilder;
import io.dapr.config.Properties;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprContainerFactory.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprContainerFactory.java
similarity index 97%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprContainerFactory.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprContainerFactory.java
index 9747268f8a..3a03d2954c 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprContainerFactory.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprContainerFactory.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
import io.dapr.testcontainers.DaprContainer;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprPreviewClientConfiguration.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprPreviewClientConfiguration.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprPreviewClientConfiguration.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprPreviewClientConfiguration.java
index 8c9ea297d1..7060440fc3 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprPreviewClientConfiguration.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprPreviewClientConfiguration.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
import io.dapr.client.DaprClientBuilder;
import io.dapr.client.DaprPreviewClient;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprSidecarContainer.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprSidecarContainer.java
similarity index 95%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprSidecarContainer.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprSidecarContainer.java
index 0d2cfa61d2..e67fec9e0e 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/DaprSidecarContainer.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/DaprSidecarContainer.java
@@ -11,9 +11,9 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
-import io.dapr.it.springboot4.testcontainers.spring.DaprSpringBootTest;
+import io.dapr.it.springboot.testcontainers.spring.DaprSpringBootTest;
import org.testcontainers.junit.jupiter.Container;
import java.lang.annotation.ElementType;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/Retry.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/Retry.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/Retry.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/Retry.java
index d74ce2acb5..6604d1b70a 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/Retry.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/Retry.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
public class Retry {
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/SubscriptionsRestController.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/SubscriptionsRestController.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/SubscriptionsRestController.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/SubscriptionsRestController.java
index 29c524a857..4fd039edf3 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/SubscriptionsRestController.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/SubscriptionsRestController.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
import io.dapr.client.domain.CloudEvent;
import org.springframework.web.bind.annotation.GetMapping;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/TestUtils.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/TestUtils.java
similarity index 98%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/TestUtils.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/TestUtils.java
index b41d7aacb9..2640538151 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/TestUtils.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/TestUtils.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers;
+package io.dapr.it.springboot.testcontainers;
import io.dapr.exceptions.DaprErrorDetails;
import io.dapr.exceptions.DaprException;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/DaprActorsIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/DaprActorsIT.java
similarity index 90%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/DaprActorsIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/DaprActorsIT.java
index 3d47d3858b..107dd042df 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/DaprActorsIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/DaprActorsIT.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.actors;
+package io.dapr.it.springboot.testcontainers.actors;
import io.dapr.actors.ActorId;
import io.dapr.actors.client.ActorClient;
@@ -20,9 +20,9 @@
import io.dapr.testcontainers.Component;
import io.dapr.testcontainers.DaprContainer;
import io.dapr.testcontainers.DaprLogLevel;
-import io.dapr.it.springboot4.testcontainers.DaprContainerFactory;
-import io.dapr.it.springboot4.testcontainers.DaprSidecarContainer;
-import io.dapr.it.springboot4.testcontainers.spring.DaprSpringBootTest;
+import io.dapr.it.springboot.testcontainers.DaprContainerFactory;
+import io.dapr.it.springboot.testcontainers.DaprSidecarContainer;
+import io.dapr.it.springboot.testcontainers.spring.DaprSpringBootTest;
import io.dapr.testcontainers.wait.strategy.DaprWait;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Tag;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActor.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActor.java
similarity index 93%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActor.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActor.java
index 4c145945a6..a25495ce31 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActor.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActor.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.actors;
+package io.dapr.it.springboot.testcontainers.actors;
import io.dapr.actors.ActorMethod;
import io.dapr.actors.ActorType;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActorImpl.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActorImpl.java
similarity index 94%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActorImpl.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActorImpl.java
index b97d72d44e..c9c558b520 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActorImpl.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActorImpl.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.actors;
+package io.dapr.it.springboot.testcontainers.actors;
import io.dapr.actors.ActorId;
import io.dapr.actors.runtime.AbstractActor;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActorsApplication.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActorsApplication.java
similarity index 95%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActorsApplication.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActorsApplication.java
index d34c857583..108b3e0138 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestActorsApplication.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestActorsApplication.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.actors;
+package io.dapr.it.springboot.testcontainers.actors;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestDaprActorsConfiguration.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestDaprActorsConfiguration.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestDaprActorsConfiguration.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestDaprActorsConfiguration.java
index 49aca5954b..4d8647598a 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/actors/TestDaprActorsConfiguration.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/actors/TestDaprActorsConfiguration.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.actors;
+package io.dapr.it.springboot.testcontainers.actors;
import java.util.Map;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/DaprConversationAlpha2IT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/DaprConversationAlpha2IT.java
similarity index 98%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/DaprConversationAlpha2IT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/DaprConversationAlpha2IT.java
index f3c0f8a7f7..544414f443 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/DaprConversationAlpha2IT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/DaprConversationAlpha2IT.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.conversations;
+package io.dapr.it.springboot.testcontainers.conversations;
import io.dapr.client.DaprPreviewClient;
import io.dapr.client.domain.AssistantMessage;
@@ -30,7 +30,7 @@
import io.dapr.client.domain.SystemMessage;
import io.dapr.client.domain.ToolMessage;
import io.dapr.client.domain.UserMessage;
-import io.dapr.it.springboot4.testcontainers.DaprPreviewClientConfiguration;
+import io.dapr.it.springboot.testcontainers.DaprPreviewClientConfiguration;
import io.dapr.testcontainers.Component;
import io.dapr.testcontainers.DaprContainer;
import io.dapr.testcontainers.DaprLogLevel;
@@ -52,7 +52,7 @@
import java.util.Map;
import java.util.Random;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/DaprConversationIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/DaprConversationIT.java
similarity index 95%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/DaprConversationIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/DaprConversationIT.java
index 4c84a7dfa9..16e6459a15 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/DaprConversationIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/DaprConversationIT.java
@@ -11,13 +11,13 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.conversations;
+package io.dapr.it.springboot.testcontainers.conversations;
import io.dapr.client.DaprPreviewClient;
import io.dapr.client.domain.ConversationInput;
import io.dapr.client.domain.ConversationRequest;
import io.dapr.client.domain.ConversationResponse;
-import io.dapr.it.springboot4.testcontainers.DaprPreviewClientConfiguration;
+import io.dapr.it.springboot.testcontainers.DaprPreviewClientConfiguration;
import io.dapr.testcontainers.Component;
import io.dapr.testcontainers.DaprContainer;
import io.dapr.testcontainers.DaprLogLevel;
@@ -39,7 +39,7 @@
import java.util.List;
import java.util.Random;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
@SpringBootTest(
webEnvironment = WebEnvironment.RANDOM_PORT,
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/TestConversationApplication.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/TestConversationApplication.java
similarity index 93%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/TestConversationApplication.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/TestConversationApplication.java
index ea750e85f1..4730bb101f 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/conversations/TestConversationApplication.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/conversations/TestConversationApplication.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.conversations;
+package io.dapr.it.springboot.testcontainers.conversations;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprContainerIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprContainerIT.java
similarity index 98%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprContainerIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprContainerIT.java
index 3ed82c25e4..4a4c7f39a6 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprContainerIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprContainerIT.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.core;
+package io.dapr.it.springboot.testcontainers.core;
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
import io.dapr.client.DaprClient;
@@ -47,7 +47,7 @@
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprPlacementContainerIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprPlacementContainerIT.java
similarity index 89%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprPlacementContainerIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprPlacementContainerIT.java
index 631e03e509..79e92812ef 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprPlacementContainerIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprPlacementContainerIT.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.core;
+package io.dapr.it.springboot.testcontainers.core;
import io.dapr.testcontainers.DaprPlacementContainer;
import org.junit.jupiter.api.Tag;
@@ -19,7 +19,7 @@
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_PLACEMENT_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_PLACEMENT_IMAGE_TAG;
import static org.junit.jupiter.api.Assertions.assertEquals;
@Testcontainers
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprSchedulerContainerIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprSchedulerContainerIT.java
similarity index 89%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprSchedulerContainerIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprSchedulerContainerIT.java
index b7e710710d..d642b90764 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/core/DaprSchedulerContainerIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/core/DaprSchedulerContainerIT.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.core;
+package io.dapr.it.springboot.testcontainers.core;
import io.dapr.testcontainers.DaprSchedulerContainer;
import org.junit.jupiter.api.Tag;
@@ -19,7 +19,7 @@
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_SCHEDULER_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_SCHEDULER_IMAGE_TAG;
import static org.junit.jupiter.api.Assertions.assertEquals;
@Testcontainers
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/crypto/DaprPreviewClientCryptoIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/crypto/DaprPreviewClientCryptoIT.java
similarity index 98%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/crypto/DaprPreviewClientCryptoIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/crypto/DaprPreviewClientCryptoIT.java
index aca329c362..48bf9ad946 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/crypto/DaprPreviewClientCryptoIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/crypto/DaprPreviewClientCryptoIT.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.crypto;
+package io.dapr.it.springboot.testcontainers.crypto;
import io.dapr.client.DaprClientBuilder;
import io.dapr.client.DaprPreviewClient;
@@ -41,7 +41,7 @@
import java.util.List;
import java.util.Random;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/jobs/DaprJobsIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/jobs/DaprJobsIT.java
similarity index 97%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/jobs/DaprJobsIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/jobs/DaprJobsIT.java
index 686c7eb01f..8bc9564029 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/jobs/DaprJobsIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/jobs/DaprJobsIT.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.jobs;
+package io.dapr.it.springboot.testcontainers.jobs;
import io.dapr.client.DaprClient;
import io.dapr.client.domain.ConstantFailurePolicy;
@@ -22,7 +22,7 @@
import io.dapr.client.domain.GetJobResponse;
import io.dapr.client.domain.JobSchedule;
import io.dapr.client.domain.ScheduleJobRequest;
-import io.dapr.it.springboot4.testcontainers.DaprClientConfiguration;
+import io.dapr.it.springboot.testcontainers.DaprClientConfiguration;
import io.dapr.testcontainers.DaprContainer;
import io.dapr.testcontainers.DaprLogLevel;
import org.junit.jupiter.api.BeforeEach;
@@ -44,7 +44,7 @@
import java.time.temporal.ChronoUnit;
import java.util.Random;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest(
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/jobs/TestJobsApplication.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/jobs/TestJobsApplication.java
similarity index 94%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/jobs/TestJobsApplication.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/jobs/TestJobsApplication.java
index e2d09f1bc8..594a410332 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/jobs/TestJobsApplication.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/jobs/TestJobsApplication.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.jobs;
+package io.dapr.it.springboot.testcontainers.jobs;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/DaprPubSubIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/DaprPubSubIT.java
similarity index 97%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/DaprPubSubIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/DaprPubSubIT.java
index 19db6f3964..33dafd2d81 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/DaprPubSubIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/DaprPubSubIT.java
@@ -10,7 +10,7 @@
* See the License for the specific language governing permissions and
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.pubsub.http;
+package io.dapr.it.springboot.testcontainers.pubsub.http;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -23,7 +23,7 @@
import io.dapr.client.domain.HttpExtension;
import io.dapr.client.domain.Metadata;
import io.dapr.client.domain.PublishEventRequest;
-import io.dapr.it.springboot4.testcontainers.DaprClientFactory;
+import io.dapr.it.springboot.testcontainers.DaprClientFactory;
import io.dapr.serializer.DaprObjectSerializer;
import io.dapr.testcontainers.DaprContainer;
import io.dapr.testcontainers.DaprLogLevel;
@@ -56,10 +56,10 @@
import java.util.Random;
import java.util.Set;
-import static io.dapr.it.springboot4.testcontainers.Retry.callWithRetry;
-import static io.dapr.it.springboot4.testcontainers.TestUtils.assertThrowsDaprException;
-import static io.dapr.it.springboot4.testcontainers.TestUtils.assertThrowsDaprExceptionWithReason;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.Retry.callWithRetry;
+import static io.dapr.it.springboot.testcontainers.TestUtils.assertThrowsDaprException;
+import static io.dapr.it.springboot.testcontainers.TestUtils.assertThrowsDaprExceptionWithReason;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/SubscriberController.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/SubscriberController.java
similarity index 99%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/SubscriberController.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/SubscriberController.java
index 1a1edd0b00..63d7c2aa25 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/SubscriberController.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/SubscriberController.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.pubsub.http;
+package io.dapr.it.springboot.testcontainers.pubsub.http;
import io.dapr.Rule;
import io.dapr.Topic;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/TestPubSubApplication.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/TestPubSubApplication.java
similarity index 93%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/TestPubSubApplication.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/TestPubSubApplication.java
index da78407d74..4801bf5a3f 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/http/TestPubSubApplication.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/http/TestPubSubApplication.java
@@ -10,7 +10,7 @@
* See the License for the specific language governing permissions and
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.pubsub.http;
+package io.dapr.it.springboot.testcontainers.pubsub.http;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java
similarity index 95%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java
index 43a7d2984e..98f5714d45 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/DaprPubSubOutboxIT.java
@@ -11,13 +11,13 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.pubsub.outbox;
+package io.dapr.it.springboot.testcontainers.pubsub.outbox;
import io.dapr.client.DaprClient;
import io.dapr.client.domain.ExecuteStateTransactionRequest;
import io.dapr.client.domain.State;
import io.dapr.client.domain.TransactionalStateOperation;
-import io.dapr.it.springboot4.testcontainers.DaprClientFactory;
+import io.dapr.it.springboot.testcontainers.DaprClientFactory;
import io.dapr.testcontainers.Component;
import io.dapr.testcontainers.DaprContainer;
import io.dapr.testcontainers.DaprLogLevel;
@@ -45,7 +45,7 @@
import java.util.Map;
import java.util.Random;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
@Disabled("Unclear why this test is failing intermittently in CI")
@SpringBootTest(
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/Product.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/Product.java
similarity index 95%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/Product.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/Product.java
index 71d6485fa2..b25f47f70f 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/Product.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/Product.java
@@ -10,7 +10,7 @@
* See the License for the specific language governing permissions and
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.pubsub.outbox;
+package io.dapr.it.springboot.testcontainers.pubsub.outbox;
import java.util.UUID;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/ProductWebhookController.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/ProductWebhookController.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/ProductWebhookController.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/ProductWebhookController.java
index 42a04521cb..55dd7dd8d8 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/ProductWebhookController.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/ProductWebhookController.java
@@ -10,7 +10,7 @@
* See the License for the specific language governing permissions and
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.pubsub.outbox;
+package io.dapr.it.springboot.testcontainers.pubsub.outbox;
import io.dapr.Topic;
import io.dapr.client.domain.CloudEvent;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/TestPubsubOutboxApplication.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/TestPubsubOutboxApplication.java
similarity index 93%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/TestPubsubOutboxApplication.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/TestPubsubOutboxApplication.java
index 5958639cc9..ba71b412e8 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/pubsub/outbox/TestPubsubOutboxApplication.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/pubsub/outbox/TestPubsubOutboxApplication.java
@@ -10,7 +10,7 @@
* See the License for the specific language governing permissions and
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.pubsub.outbox;
+package io.dapr.it.springboot.testcontainers.pubsub.outbox;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootContextInitializer.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootContextInitializer.java
similarity index 98%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootContextInitializer.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootContextInitializer.java
index b28e2301bf..a9a79cd1ba 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootContextInitializer.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootContextInitializer.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.spring;
+package io.dapr.it.springboot.testcontainers.spring;
import io.dapr.testcontainers.DaprContainer;
import org.springframework.context.ApplicationContextInitializer;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootExtension.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootExtension.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootExtension.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootExtension.java
index 607bfcadc6..d059fcfc41 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootExtension.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootExtension.java
@@ -11,10 +11,10 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.spring;
+package io.dapr.it.springboot.testcontainers.spring;
import io.dapr.testcontainers.DaprContainer;
-import io.dapr.it.springboot4.testcontainers.DaprSidecarContainer;
+import io.dapr.it.springboot.testcontainers.DaprSidecarContainer;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.platform.commons.support.AnnotationSupport;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootTest.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootTest.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootTest.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootTest.java
index d05217b034..9cb09caa60 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/spring/DaprSpringBootTest.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/spring/DaprSpringBootTest.java
@@ -11,9 +11,9 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.spring;
+package io.dapr.it.springboot.testcontainers.spring;
-import io.dapr.it.springboot4.testcontainers.DaprSidecarContainer;
+import io.dapr.it.springboot.testcontainers.DaprSidecarContainer;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/DaprWorkflowsIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/DaprWorkflowsIT.java
similarity index 98%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/DaprWorkflowsIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/DaprWorkflowsIT.java
index 00799e2382..a292d7393b 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/DaprWorkflowsIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/DaprWorkflowsIT.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -41,7 +41,7 @@
import java.util.Collections;
import java.util.Map;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/FirstActivity.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/FirstActivity.java
similarity index 94%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/FirstActivity.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/FirstActivity.java
index 24c640d4ae..ac677dcc8c 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/FirstActivity.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/FirstActivity.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import io.dapr.workflows.WorkflowActivity;
import io.dapr.workflows.WorkflowActivityContext;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/KeyStore.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/KeyStore.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/KeyStore.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/KeyStore.java
index bd75523447..8af14ffaeb 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/KeyStore.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/KeyStore.java
@@ -10,7 +10,7 @@
* See the License for the specific language governing permissions and
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import java.util.HashMap;
import java.util.Map;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/SecondActivity.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/SecondActivity.java
similarity index 94%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/SecondActivity.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/SecondActivity.java
index ecaa63a812..7a5b1d1960 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/SecondActivity.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/SecondActivity.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import io.dapr.workflows.WorkflowActivity;
import io.dapr.workflows.WorkflowActivityContext;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TaskExecutionIdActivity.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TaskExecutionIdActivity.java
similarity index 95%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TaskExecutionIdActivity.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TaskExecutionIdActivity.java
index 8d523529e4..0004345a74 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TaskExecutionIdActivity.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TaskExecutionIdActivity.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import io.dapr.workflows.WorkflowActivity;
import io.dapr.workflows.WorkflowActivityContext;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestExecutionKeysWorkflow.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestExecutionKeysWorkflow.java
similarity index 97%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestExecutionKeysWorkflow.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestExecutionKeysWorkflow.java
index 98460a8c02..6c5537988a 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestExecutionKeysWorkflow.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestExecutionKeysWorkflow.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import io.dapr.durabletask.Task;
import io.dapr.workflows.Workflow;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestNamedActivitiesWorkflow.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestNamedActivitiesWorkflow.java
similarity index 97%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestNamedActivitiesWorkflow.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestNamedActivitiesWorkflow.java
index d9f90254a0..bf7d47a4bc 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestNamedActivitiesWorkflow.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestNamedActivitiesWorkflow.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import io.dapr.workflows.Workflow;
import io.dapr.workflows.WorkflowStub;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflow.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflow.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflow.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflow.java
index 27d17aa522..ce200ba0e9 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflow.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflow.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import io.dapr.workflows.Workflow;
import io.dapr.workflows.WorkflowStub;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowPayload.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowPayload.java
similarity index 95%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowPayload.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowPayload.java
index 186badbd07..020008a8a5 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowPayload.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowPayload.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import java.util.List;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowsApplication.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowsApplication.java
similarity index 93%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowsApplication.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowsApplication.java
index 4c7da42906..0639a8f3a7 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowsApplication.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowsApplication.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowsConfiguration.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowsConfiguration.java
similarity index 98%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowsConfiguration.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowsConfiguration.java
index 5aa5b4c3eb..387d76ac49 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/TestWorkflowsConfiguration.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/TestWorkflowsConfiguration.java
@@ -11,7 +11,7 @@
limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows;
+package io.dapr.it.springboot.testcontainers.workflows;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.dapr.config.Properties;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App2TransformActivity.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App2TransformActivity.java
similarity index 94%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App2TransformActivity.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App2TransformActivity.java
index b94386ede7..ff6ceaae7d 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App2TransformActivity.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App2TransformActivity.java
@@ -11,7 +11,7 @@
* limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows.multiapp;
+package io.dapr.it.springboot.testcontainers.workflows.multiapp;
import io.dapr.workflows.WorkflowActivity;
import io.dapr.workflows.WorkflowActivityContext;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App2Worker.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App2Worker.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App2Worker.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App2Worker.java
index 1cecf9b2a2..47925fd933 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App2Worker.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App2Worker.java
@@ -11,7 +11,7 @@
* limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows.multiapp;
+package io.dapr.it.springboot.testcontainers.workflows.multiapp;
import io.dapr.workflows.runtime.WorkflowRuntime;
import io.dapr.workflows.runtime.WorkflowRuntimeBuilder;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App3FinalizeActivity.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App3FinalizeActivity.java
similarity index 94%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App3FinalizeActivity.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App3FinalizeActivity.java
index 6b30d01f3a..47a0cd87da 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App3FinalizeActivity.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App3FinalizeActivity.java
@@ -11,7 +11,7 @@
* limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows.multiapp;
+package io.dapr.it.springboot.testcontainers.workflows.multiapp;
import io.dapr.workflows.WorkflowActivity;
import io.dapr.workflows.WorkflowActivityContext;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App3Worker.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App3Worker.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App3Worker.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App3Worker.java
index 7644c206f7..ba72a7960e 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/App3Worker.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/App3Worker.java
@@ -11,7 +11,7 @@
* limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows.multiapp;
+package io.dapr.it.springboot.testcontainers.workflows.multiapp;
import io.dapr.workflows.runtime.WorkflowRuntime;
import io.dapr.workflows.runtime.WorkflowRuntimeBuilder;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/MultiAppWorker.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/MultiAppWorker.java
similarity index 95%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/MultiAppWorker.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/MultiAppWorker.java
index 794b0a18d3..908680d820 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/MultiAppWorker.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/MultiAppWorker.java
@@ -11,7 +11,7 @@
* limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows.multiapp;
+package io.dapr.it.springboot.testcontainers.workflows.multiapp;
import io.dapr.workflows.runtime.WorkflowRuntime;
import io.dapr.workflows.runtime.WorkflowRuntimeBuilder;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/MultiAppWorkflow.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/MultiAppWorkflow.java
similarity index 96%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/MultiAppWorkflow.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/MultiAppWorkflow.java
index 56b3f6aded..fc66fa090d 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/MultiAppWorkflow.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/MultiAppWorkflow.java
@@ -11,7 +11,7 @@
* limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows.multiapp;
+package io.dapr.it.springboot.testcontainers.workflows.multiapp;
import io.dapr.workflows.Workflow;
import io.dapr.workflows.WorkflowStub;
diff --git a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/WorkflowsMultiAppCallActivityIT.java b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/WorkflowsMultiAppCallActivityIT.java
similarity index 94%
rename from spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/WorkflowsMultiAppCallActivityIT.java
rename to spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/WorkflowsMultiAppCallActivityIT.java
index 348f0d1756..364f330175 100644
--- a/spring-boot-4-sdk-tests/src/test/java/io/dapr/it/springboot4/testcontainers/workflows/multiapp/WorkflowsMultiAppCallActivityIT.java
+++ b/spring-boot-sdk-tests/src/test/java/io/dapr/it/springboot/testcontainers/workflows/multiapp/WorkflowsMultiAppCallActivityIT.java
@@ -11,9 +11,9 @@
* limitations under the License.
*/
-package io.dapr.it.springboot4.testcontainers.workflows.multiapp;
+package io.dapr.it.springboot.testcontainers.workflows.multiapp;
-import io.dapr.it.springboot4.testcontainers.ContainerConstants;
+import io.dapr.it.springboot.testcontainers.ContainerConstants;
import io.dapr.testcontainers.Component;
import io.dapr.testcontainers.DaprContainer;
import io.dapr.testcontainers.DaprLogLevel;
@@ -35,7 +35,7 @@
import java.time.Duration;
import java.util.Map;
-import static io.dapr.it.springboot4.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
+import static io.dapr.it.springboot.testcontainers.ContainerConstants.DAPR_RUNTIME_IMAGE_TAG;
import static io.dapr.testcontainers.DaprContainerConstants.DAPR_PLACEMENT_IMAGE_TAG;
import static io.dapr.testcontainers.DaprContainerConstants.DAPR_SCHEDULER_IMAGE_TAG;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -120,7 +120,7 @@ public class WorkflowsMultiAppCallActivityIT {
"-Ddapr.app.id=multiapp-worker",
"-Ddapr.grpc.endpoint=main-workflow-sidecar:50001",
"-Ddapr.http.endpoint=main-workflow-sidecar:3500",
- "io.dapr.it.springboot4.testcontainers.workflows.multiapp.MultiAppWorker")
+ "io.dapr.it.springboot.testcontainers.workflows.multiapp.MultiAppWorker")
.withNetwork(DAPR_NETWORK)
.dependsOn(MAIN_WORKFLOW_SIDECAR)
.waitingFor(Wait.forLogMessage(".*MultiAppWorker started.*", 1))
@@ -134,7 +134,7 @@ public class WorkflowsMultiAppCallActivityIT {
"-Ddapr.app.id=app2",
"-Ddapr.grpc.endpoint=app2-sidecar:50001",
"-Ddapr.http.endpoint=app2-sidecar:3500",
- "io.dapr.it.springboot4.testcontainers.workflows.multiapp.App2Worker")
+ "io.dapr.it.springboot.testcontainers.workflows.multiapp.App2Worker")
.withNetwork(DAPR_NETWORK)
.dependsOn(APP2_SIDECAR)
.waitingFor(Wait.forLogMessage(".*App2Worker started.*", 1))
@@ -148,7 +148,7 @@ public class WorkflowsMultiAppCallActivityIT {
"-Ddapr.app.id=app3",
"-Ddapr.grpc.endpoint=app3-sidecar:50001",
"-Ddapr.http.endpoint=app3-sidecar:3500",
- "io.dapr.it.springboot4.testcontainers.workflows.multiapp.App3Worker")
+ "io.dapr.it.springboot.testcontainers.workflows.multiapp.App3Worker")
.withNetwork(DAPR_NETWORK)
.dependsOn(APP3_SIDECAR)
.waitingFor(Wait.forLogMessage(".*App3Worker started.*", 1))