Skip to content

Commit d9a768b

Browse files
Introduce new spring properties setup for services. (#585)
* Introduce new spring properties setup for services. This allows to configure a service directly from spring's properties file. It also allows to set the executor for handler options, fixing #578 * Fix configuration properties metadata generation. This makes sure intellij will be able to pickup the restate spring properties
1 parent a28902f commit d9a768b

File tree

18 files changed

+1482
-64
lines changed

18 files changed

+1482
-64
lines changed

gradle/libs.versions.toml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@
177177
[libraries.spring-boot-starter-test.version]
178178
ref = 'spring-boot'
179179

180+
[libraries.spring-boot-configuration-processor]
181+
module = 'org.springframework.boot:spring-boot-configuration-processor'
182+
183+
[libraries.spring-boot-configuration-processor.version]
184+
ref = 'spring-boot'
185+
180186
[libraries.vertx-core]
181187
module = 'io.vertx:vertx-core'
182188

@@ -237,6 +243,6 @@
237243
protobuf = '4.29.3'
238244
restate = '2.6.0-SNAPSHOT'
239245
schema-kenerator = '2.1.2'
240-
spring-boot = '3.4.9'
246+
spring-boot = '3.5.10'
241247
vertx = '4.5.22'
242248
victools-json-schema = '4.38.0'

sdk-spring-boot-kotlin-starter/src/test/kotlin/dev/restate/sdk/springboot/kotlin/RestateHttpEndpointBeanTest.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ package dev.restate.sdk.springboot.kotlin
1010

1111
import com.fasterxml.jackson.databind.ObjectMapper
1212
import dev.restate.sdk.core.generated.manifest.EndpointManifestSchema
13+
import dev.restate.sdk.springboot.RestateEndpointConfiguration
14+
import dev.restate.sdk.springboot.RestateHttpConfiguration
1315
import dev.restate.sdk.springboot.RestateHttpEndpointBean
1416
import java.io.IOException
1517
import java.net.URI
@@ -22,7 +24,8 @@ import org.springframework.beans.factory.annotation.Autowired
2224
import org.springframework.boot.test.context.SpringBootTest
2325

2426
@SpringBootTest(
25-
classes = [RestateHttpEndpointBean::class, Greeter::class],
27+
classes =
28+
[RestateEndpointConfiguration::class, RestateHttpConfiguration::class, Greeter::class],
2629
properties = ["restate.sdk.http.port=0"],
2730
)
2831
class RestateHttpEndpointBeanTest {

sdk-spring-boot-starter/src/test/java/dev/restate/sdk/springboot/java/RestateHttpEndpointBeanTest.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,31 @@
1212

1313
import com.fasterxml.jackson.databind.ObjectMapper;
1414
import dev.restate.sdk.core.generated.manifest.EndpointManifestSchema;
15+
import dev.restate.sdk.springboot.RestateEndpointConfiguration;
16+
import dev.restate.sdk.springboot.RestateHttpConfiguration;
1517
import dev.restate.sdk.springboot.RestateHttpEndpointBean;
1618
import java.io.IOException;
1719
import java.net.URI;
1820
import java.net.http.HttpClient;
1921
import java.net.http.HttpRequest;
2022
import java.net.http.HttpResponse;
23+
import java.time.Duration;
2124
import org.junit.jupiter.api.Test;
2225
import org.springframework.beans.factory.annotation.Autowired;
2326
import org.springframework.boot.test.context.SpringBootTest;
2427

2528
@SpringBootTest(
26-
classes = {RestateHttpEndpointBean.class, Greeter.class, Configuration.class},
27-
properties = {"restate.sdk.http.port=0"})
29+
classes = {
30+
RestateEndpointConfiguration.class,
31+
RestateHttpConfiguration.class,
32+
Greeter.class,
33+
ServicesConfiguration.class
34+
},
35+
properties = {
36+
"restate.sdk.http.port=0",
37+
"restate.components.greeter.journal-retention=PT48H",
38+
"greetingPrefix=Hello "
39+
})
2840
public class RestateHttpEndpointBeanTest {
2941

3042
@Autowired private RestateHttpEndpointBean restateHttpEndpointBean;
@@ -56,7 +68,8 @@ public void httpEndpointShouldBeRunning() throws IOException, InterruptedExcepti
5668
assertThat(endpointManifest.getServices())
5769
.extracting(
5870
dev.restate.sdk.core.generated.manifest.Service::getName,
59-
dev.restate.sdk.core.generated.manifest.Service::getDocumentation)
60-
.containsOnly(tuple("greeter", "blabla"));
71+
dev.restate.sdk.core.generated.manifest.Service::getDocumentation,
72+
dev.restate.sdk.core.generated.manifest.Service::getJournalRetention)
73+
.containsOnly(tuple("greeter", "blabla", Duration.ofDays(2).toMillis()));
6174
}
6275
}

sdk-spring-boot-starter/src/test/java/dev/restate/sdk/springboot/java/Configuration.java renamed to sdk-spring-boot-starter/src/test/java/dev/restate/sdk/springboot/java/ServicesConfiguration.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,17 @@
88
// https://github.com/restatedev/sdk-java/blob/main/LICENSE
99
package dev.restate.sdk.springboot.java;
1010

11-
import dev.restate.sdk.springboot.RestateServiceConfigurator;
11+
import dev.restate.sdk.springboot.RestateComponentProperties;
1212
import org.springframework.context.annotation.Bean;
13+
import org.springframework.context.annotation.Configuration;
14+
15+
@Configuration
16+
public class ServicesConfiguration {
1317

14-
public class Configuration {
1518
@Bean
16-
public RestateServiceConfigurator greeterConfiguration() {
17-
return configurator -> configurator.documentation("blabla");
19+
public RestateComponentProperties greeterConfiguration() {
20+
var properties = new RestateComponentProperties();
21+
properties.setDocumentation("blabla");
22+
return properties;
1823
}
1924
}

sdk-spring-boot/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ description = "Restate SDK Spring Boot integration"
1010
dependencies {
1111
compileOnly(libs.jspecify)
1212

13+
// This generates the metadata needed for the configuration properties
14+
annotationProcessor(libs.spring.boot.configuration.processor)
15+
1316
val excludeJackson =
1417
fun ProjectDependency.() {
1518
// Let spring bring jackson in

sdk-spring-boot/src/main/java/dev/restate/sdk/springboot/EnableRestate.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,9 @@
2222
@Target(ElementType.TYPE)
2323
@Retention(RetentionPolicy.RUNTIME)
2424
@Documented
25-
@Import({RestateHttpEndpointBean.class, RestateClientAutoConfiguration.class})
25+
@Import({
26+
RestateEndpointConfiguration.class,
27+
RestateHttpConfiguration.class,
28+
RestateClientAutoConfiguration.class
29+
})
2630
public @interface EnableRestate {}

sdk-spring-boot/src/main/java/dev/restate/sdk/springboot/RestateComponent.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@
2525
@Component
2626
public @interface RestateComponent {
2727
/**
28-
* Bean name to use to configure this component. The bean MUST be an instance of {@link
29-
* RestateServiceConfigurator}.
28+
* Bean name to use to configure this component.
29+
*
30+
* <p>The bean MUST be an instance of {@link RestateComponentProperties}.
3031
*/
3132
String configuration() default "";
3233
}

0 commit comments

Comments
 (0)